JP2007521537A - データの編成、検索、および共有のためのストレージプラットフォーム - Google Patents
データの編成、検索、および共有のためのストレージプラットフォーム Download PDFInfo
- Publication number
- JP2007521537A JP2007521537A JP2005509111A JP2005509111A JP2007521537A JP 2007521537 A JP2007521537 A JP 2007521537A JP 2005509111 A JP2005509111 A JP 2005509111A JP 2005509111 A JP2005509111 A JP 2005509111A JP 2007521537 A JP2007521537 A JP 2007521537A
- Authority
- JP
- Japan
- Prior art keywords
- item
- storage platform
- items
- data
- type
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000003860 storage Methods 0.000 title claims abstract description 499
- 230000008520 organization Effects 0.000 title claims abstract description 26
- 238000013499 data model Methods 0.000 claims abstract description 35
- 238000000034 method Methods 0.000 claims description 126
- 230000006399 behavior Effects 0.000 claims description 41
- 230000008569 process Effects 0.000 claims description 26
- 230000006870 function Effects 0.000 abstract description 44
- 230000001360 synchronised effect Effects 0.000 abstract description 24
- 230000008859 change Effects 0.000 description 109
- 238000013507 mapping Methods 0.000 description 41
- 238000012545 processing Methods 0.000 description 40
- 230000007246 mechanism Effects 0.000 description 33
- 238000010586 diagram Methods 0.000 description 27
- 239000011800 void material Substances 0.000 description 20
- 238000001514 detection method Methods 0.000 description 19
- 230000014759 maintenance of location Effects 0.000 description 19
- 230000015654 memory Effects 0.000 description 17
- 230000014509 gene expression Effects 0.000 description 15
- 230000003068 static effect Effects 0.000 description 15
- 230000009471 action Effects 0.000 description 9
- 238000007726 management method Methods 0.000 description 9
- 230000036961 partial effect Effects 0.000 description 9
- 239000008186 active pharmaceutical agent Substances 0.000 description 8
- 238000013459 approach Methods 0.000 description 8
- 230000003287 optical effect Effects 0.000 description 8
- 238000012384 transportation and delivery Methods 0.000 description 8
- 238000013461 design Methods 0.000 description 7
- 230000003111 delayed effect Effects 0.000 description 6
- 238000006243 chemical reaction Methods 0.000 description 5
- 210000001072 colon Anatomy 0.000 description 5
- 238000004891 communication Methods 0.000 description 5
- 238000013500 data storage Methods 0.000 description 5
- 238000012544 monitoring process Methods 0.000 description 5
- 230000008901 benefit Effects 0.000 description 4
- 238000005516 engineering process Methods 0.000 description 4
- 230000004048 modification Effects 0.000 description 4
- 238000012986 modification Methods 0.000 description 4
- 230000002688 persistence Effects 0.000 description 4
- 230000002829 reductive effect Effects 0.000 description 4
- 230000004044 response Effects 0.000 description 4
- 230000009466 transformation Effects 0.000 description 4
- 230000027455 binding Effects 0.000 description 3
- 238000009739 binding Methods 0.000 description 3
- 150000001875 compounds Chemical class 0.000 description 3
- 238000012217 deletion Methods 0.000 description 3
- 230000037430 deletion Effects 0.000 description 3
- 238000011161 development Methods 0.000 description 3
- 230000005012 migration Effects 0.000 description 3
- 238000013508 migration Methods 0.000 description 3
- 230000006855 networking Effects 0.000 description 3
- 230000000644 propagated effect Effects 0.000 description 3
- 230000000717 retained effect Effects 0.000 description 3
- 238000000844 transformation Methods 0.000 description 3
- 235000000177 Indigofera tinctoria Nutrition 0.000 description 2
- 238000012550 audit Methods 0.000 description 2
- 230000005540 biological transmission Effects 0.000 description 2
- 239000003795 chemical substances by application Substances 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 238000001914 filtration Methods 0.000 description 2
- 229940097275 indigo Drugs 0.000 description 2
- COHYTHOBJLSHDF-UHFFFAOYSA-N indigo powder Natural products N1C2=CC=CC=C2C(=O)C1=C1C(=O)C2=CC=CC=C2N1 COHYTHOBJLSHDF-UHFFFAOYSA-N 0.000 description 2
- 239000003999 initiator Substances 0.000 description 2
- 238000007689 inspection Methods 0.000 description 2
- 230000003993 interaction Effects 0.000 description 2
- 230000002452 interceptive effect Effects 0.000 description 2
- 238000002955 isolation Methods 0.000 description 2
- 230000005055 memory storage Effects 0.000 description 2
- 230000002093 peripheral effect Effects 0.000 description 2
- 230000002085 persistent effect Effects 0.000 description 2
- 238000002360 preparation method Methods 0.000 description 2
- 238000011112 process operation Methods 0.000 description 2
- 238000010926 purge Methods 0.000 description 2
- 238000010561 standard procedure Methods 0.000 description 2
- SPBWHPXCWJLQRU-FITJORAGSA-N 4-amino-8-[(2r,3r,4s,5r)-3,4-dihydroxy-5-(hydroxymethyl)oxolan-2-yl]-5-oxopyrido[2,3-d]pyrimidine-6-carboxamide Chemical compound C12=NC=NC(N)=C2C(=O)C(C(=O)N)=CN1[C@@H]1O[C@H](CO)[C@@H](O)[C@H]1O SPBWHPXCWJLQRU-FITJORAGSA-N 0.000 description 1
- 239000002253 acid Substances 0.000 description 1
- 230000002730 additional effect Effects 0.000 description 1
- 230000002776 aggregation Effects 0.000 description 1
- 238000004220 aggregation Methods 0.000 description 1
- 230000003466 anti-cipated effect Effects 0.000 description 1
- 230000000712 assembly Effects 0.000 description 1
- 238000000429 assembly Methods 0.000 description 1
- 230000003190 augmentative effect Effects 0.000 description 1
- 238000013475 authorization Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000010276 construction Methods 0.000 description 1
- 230000008878 coupling Effects 0.000 description 1
- 238000010168 coupling process Methods 0.000 description 1
- 238000005859 coupling reaction Methods 0.000 description 1
- 125000004122 cyclic group Chemical group 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000009795 derivation Methods 0.000 description 1
- 238000009429 electrical wiring Methods 0.000 description 1
- 239000012634 fragment Substances 0.000 description 1
- 230000008676 import Effects 0.000 description 1
- 230000010365 information processing Effects 0.000 description 1
- 230000000977 initiatory effect Effects 0.000 description 1
- 238000003780 insertion Methods 0.000 description 1
- 230000037431 insertion Effects 0.000 description 1
- 238000005304 joining Methods 0.000 description 1
- 230000000670 limiting effect Effects 0.000 description 1
- 230000003340 mental effect Effects 0.000 description 1
- 230000003278 mimic effect Effects 0.000 description 1
- 238000012806 monitoring device Methods 0.000 description 1
- 239000010813 municipal solid waste Substances 0.000 description 1
- 239000013307 optical fiber Substances 0.000 description 1
- 238000005457 optimization Methods 0.000 description 1
- 238000007639 printing Methods 0.000 description 1
- 230000035755 proliferation Effects 0.000 description 1
- 230000001902 propagating effect Effects 0.000 description 1
- 230000010076 replication Effects 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
- 238000000638 solvent extraction Methods 0.000 description 1
- 230000008685 targeting Effects 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
- 238000010200 validation analysis Methods 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Images
Classifications
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L69/00—Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
- H04L69/30—Definitions, standards or architectural aspects of layered protocol stacks
- H04L69/32—Architecture of open systems interconnection [OSI] 7-layer type protocol stacks, e.g. the interfaces between the data link level and the physical level
- H04L69/322—Intralayer communication protocols among peer entities or protocol data unit [PDU] definitions
- H04L69/329—Intralayer communication protocols among peer entities or protocol data unit [PDU] definitions in the application layer [OSI layer 7]
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L67/00—Network arrangements or protocols for supporting network services or applications
- H04L67/01—Protocols
- H04L67/10—Protocols in which an application is distributed across nodes in the network
- H04L67/1095—Replication or mirroring of data, e.g. scheduling or transport for data synchronisation between network nodes
Landscapes
- Engineering & Computer Science (AREA)
- Computer Networks & Wireless Communication (AREA)
- Signal Processing (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
Description
I.序論
A.例示的なコンピューティング環境
B.従来のファイルベースのストレージ
II.データの編成、検索、および共有のための新しいストレージプラットフォーム
A.用語解説
B.ストレージプラットフォームの概要
C.データモデル
1.Items
2.Itemの識別
a)アイテム参照
(1)ItemIDReference
(2)ItemPathReference
b)参照型階層
3.Item FoldersおよびCategories
4.Schemas
a)Base Schema
b)Core Schema
5.関係
a)関係の宣言
b)保持Relationship
c)埋め込み関係
d)参照関係
e)規則と制約条件
f)関係の順序付け
6.拡張性
a)アイテム拡張
b)NestedElement型の拡張
D.データベースエンジン
1.UDTを使用したデータストアの実装
2.アイテムのマッピング
3.拡張マッピング
4.ネストされている要素のマッピング
5.オブジェクト識別
6.SQLオブジェクトの命名規則
7.列の命名規則
8.検索ビュー
a)アイテム
(1)マスターアイテム検索ビュー
(2)型付きアイテム検索ビュー
b)アイテム拡張
(1)マスター拡張検索ビュー
(2)型付き拡張検索ビュー
c)ネストされている要素
d)関係
(1)マスター関係検索ビュー
(2)関係インスタンス検索ビュー
9.更新
10.変更追跡&ツームストーン
a)変更追跡
(1)「マスター」検索ビューでの変更追跡
(2)「型付き」検索ビューでの変更追跡
b)ツームストーン
(1)アイテムツームストーン
(2)拡張ツームストーン
(3)関係ツームストーン
(4)ツームストーンのクリーンアップ
11.ヘルパAPIおよび関数
a)関数[System.Storage].GetItem
b)関数[System.Storage].GetExtension
c)関数[System.Storage].GetRelationship
12.メタデータ
a)スキーマメタデータ
b)インスタンスメタデータ
E.セキュリティ
1.概要
2.セキュリティモデルの詳細な説明
a)セキュリティ記述子構造
(1)アクセスマスク形式
(2)汎用アクセス権
(3)標準アクセス権
b)アイテム特有の権利
(1)ファイルおよびディレクトリオブジェクト特有の権利
(2)WinFSItemRead
(3)WinFSItemReadAttributes
(4)WinFSItemWriteAttributes
(5)WinFSItemWrite
(6)WinFSItemAddLink
(7)WinFSItemDeleteLink
(8)アイテムを削除する権利
(9)アイテムをコピーする権利
(10)アイテムを移動する権利
(11)アイテム上のセキュリティポリシーを表示する権利
(12)アイテム上のセキュリティポリシーを変更する権利
(13)直接の等価物を持たない権利
3.実装
a)コンテナ内に新しいアイテムを作成する
b)明示的なACLをアイテムに追加する
c)保持Relationshipをアイテムに追加する
d)保持Relationshipをアイテムから削除する
e)明示的なACLをアイテムから削除する
f)アイテムに関連付けられているACLを修正する
F.通知および変更追跡
1.ストレージ変更イベント
a)イベント
b)ウォッチャ(Watchers)
2.変更追跡および通知生成メカニズム
a)変更追跡
b)タイムスタンプ管理
c)データ変更検出−イベント検出
G.同期
1.ストレージプラットフォームとストレージプラットフォームとの間の同期処理
a)同期(Sync)制御アプリケーション
b)スキーマ注釈
c)同期設定
(1)コミュニティフォルダ−マッピング
(2)プロファイル
(3)スケジュール
d)競合回避処理
(1)競合検出
(a)知識ベースの競合
(b)制約ベースの競合
(2)競合処理
(a)自動競合解決
(b)競合ログ作成
(c)競合の検査および解決
(d)レプリカの収束および競合解決の伝搬
2.非ストレージプラットフォームデータストアの同期処理
a)同期処理サービス
(1)Change Enumeration
(2)Change Application
(3)Conflict Resolution
b)アダプタの実装
3.セキュリティ
4.管理容易性
H.従来のファイルシステムの相互運用性
1.相互運用性のためのモデル
2.データストアの機能
a)ボリュームではない
b)ストア構造
c)すべてのファイルが移動(migrated)されるわけではない
d)NTFS名前空間でのストレージプラットフォームファイルへのアクセス
e)予期される名前空間/ドライブ文字(letters)
I.ストレージプラットフォームAPI
1.概要
2.命名およびスコープ
3.ストレージプラットフォームAPIコンポーネント
4.データクラス
5.ランタイムフレームワーク
a)ランタイムフレームワーククラス
(1)ItemContext
(2)ItemSearcher
(a)ターゲット型
(b)フィルタ
(c)検索の準備
(d)検索オプション
(3)アイテム結果ストリーム(「FindResult」)
b)動作中のランタイムフレームワーク
c)共通プログラミングパターン
(1)ItemContextオブジェクトを開く、閉じる
(2)オブジェクトの検索
(a)検索オプション
(b)FindOneおよびFindOnly
(c)ItemContext上のショートカットを検索する
(d)IDまたはパスによって検索する
(e)GetSearcherパターン
(3)ストアの更新
6.セキュリティ
7.関係についてのサポート
a)基本関係型
(1)関係クラス
(2)ItemReferenceクラス
(3)ItemIdReferenceクラス
(4)ItemPathReferenceクラス
(5)RelationshipId構造体
(6)VirtualRelationshipCollectionクラス
b)生成された関係型
(1)生成された関係型
(2)RelationshipPrototypeクラス
(3)RelationshipPrototypeCollection
クラス
c)Itemクラス内の関係サポート
(1)Itemクラス
(2)RelationshipCollectionクラス
d)検索式の中の関係サポート
(1)アイテムから関係へのトラバース
(2)関係からアイテムへのトラバース
(3)関係トラバースの組合せ
e)関係サポートの使用例
(1)関係の検索
(2)関係からソースおよびターゲットアイテムへのナビゲート
(3)ソースアイテムから関係へのナビゲート
(4)関係(およびアイテム)の作成
(5)関係(およびアイテム)の削除
8.ストレージプラットフォームAPIの「拡張」
a)ドメインビヘイビア
b)付加価値ビヘイビア
c)サービスプロバイダとしての付加価値ビヘイビア
9.デザインタイムフレームワーク
10.クエリ形式(formalism)
a)フィルタの基本事項
b)型変換
c)フィルタ構文
11.リモーティング
a)APIにおけるローカル/リモート透過性
b)リモーティングのストレージプラットフォーム実装
c)非ストレージプラットフォームストアへのアクセス
d)DFSとの関係
e)GXA/Indigoとの関係
12.制約条件
13.共有
a)共有の表現
b)共有の管理
c)共有のアクセス
d)発見可能性
14.Findの意味
15.ストレージプラットフォームContacts API
a)System.Storage.Contactの概要
b)ドメインビヘイビア
16.ストレージプラットフォームFile API
a)序論
(1)ストレージプラットフォーム内でのNTFSボリュームの反映
(2)ストレージプラットフォーム名前空間内でのファイルおよび
ディレクトリの作成
b)Fileスキーマ
c)System.Storage.Filesの概要
d)コード例
(1)ファイルを開き書き込む
(2)クエリの使用
e)ドメインビヘイビア
J.まとめ
本発明の主題は、法的要件を満たすように特異性(specificity)とともに説明されている。しかし、説明自体は、本発明の範囲を制限することを意図されていない。むしろ、発明者は、主張されている主題は、他の現在または将来の技術とともに、本明細書で説明されているステップと類似しているが異なるステップまたはステップの組合せを含むように、他の方法でも具現化されうることを考察した。さらに、「ステップ」という用語は、本明細書では、採用されている方法の異なる要素を暗示するために使用される場合があるが、この用語は、個々のステップの順序が明示的に説明されている場合を除き、本明細書で開示されている様々なステップ間の特定の順序を示唆するものとして解釈すべきではない。
本発明の数多くの実施形態は、コンピュータ上で実行することができる。図1および以下の説明は、本発明を実施できる適当なコンピューティング環境について簡潔に述べた一般的な説明となることを意図している。必要というわけではないが、本発明の様々な態様は、クライアントワークステーションまたはサーバなどのコンピュータにより実行される、プログラムモジュールなどの、コンピュータ実行可能命令の一般的文脈において説明することができる。一般に、プログラムモジュールは、特定のタスクを実行する、または特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などを含む。さらに、本発明は、ハンドヘルドデバイス、マルチプロセッサシステム、マイクロプロセッサベースのまたはプログラム可能な家電製品、ネットワークPC、ミニコンピュータ、メインフレームコンピュータなどを含む、他のコンピュータシステム構成を使用して実施できる。また、本発明は、通信ネットワークを通じてリンクされているリモート処理装置によりタスクが実行される分散コンピューティング環境で実施することもできる。分散コンピューティング環境では、プログラムモジュールは、ローカルおよびリモートの両方のメモリ記憶デバイス内に配置されうる。
ほとんどの今日のコンピュータシステムでは、「ファイル」は、ハードウェア/ソフトウェアインターフェースシステムだけでなくアプリケーションプログラム、データセットなどをも含むことができる格納可能な情報のユニットである。現代的なすべてのハードウェア/ソフトウェアインターフェースシステム(Windows(登録商標)、Unix(登録商標)、Linux、MacOS、仮想マシンシステムなど)では、ファイルは、ハードウェア/ソフトウェアインターフェースシステムにより操作可能な情報(例えば、データ、プログラムなど)の基本的な個別の(格納可能および取り出し可能な)ユニットである。ファイルのグループは、「フォルダ」単位で一般的には編成される。Microsoft Windows(登録商標)、Macintosh OS、およびその他のハードウェア/ソフトウェアインターフェースシステムでは、フォルダとは、取り出し可能、移動可能、そして単一の情報ユニットとして他の何らかの手段により操作できるファイルのコレクションのことである。これらのフォルダは、次に、「ディレクトリ」(以下で詳述する)と呼ばれるツリーベースの階層型配列で編成される。DOS、z/OS、およびほとんどのUnix(登録商標)ベースのオペレーティングシステムなど他のいくつかのハードウェア/ソフトウェアインターフェースシステムでは、「ディレクトリ」および/または「フォルダ」という用語は交換して使用することができ、また以前のAppleコンピュータシステム(例えば、Apple IIe)ではディレクトリの代わりに「カタログ」という用語を使用していたが、本明細書で使用されているように、これらの用語はすべて、同義語であり交換可能であるとみなし、階層型情報記憶構造およびそのフォルダおよびファイルコンポーネントに対する他のすべての相当する用語および参照を含むことを意図している。
本発明は、データの編成、検索、および共有のためのストレージプラットフォームを対象とする。本発明のストレージプラットフォームは、上述の種類の既存のファイルシステムおよびデータベースシステムを超えてデータプラットフォームの概念を拡張し、広げるものであり、Itemと呼ばれるデータの新しい形態を含む、すべての型のデータ用のストアとなるように設計されている。
本明細書で使用されているように、また請求項で使用されているように、以下の用語は以下の意味を持つ。
図3を参照すると、本発明によるストレージプラットフォーム300は、データベースエンジン314上に実装されたデータストア302を備える。一実施形態では、データベースエンジンは、オブジェクトリレーショナルの拡張機能を備えるリレーショナルデータベースエンジンを含む。一実施形態では、リレーショナルデータベースエンジン314は、Microsoft SQL Serverリレーショナルデータベースエンジンを含む。
本発明のストレージプラットフォーム300のデータストア302は、ストア内に置かれているデータの編成、検索、共有、同期、およびセキュリティをサポートするデータモデルを実装する。本発明のデータモデルでは、「Item」は、ストレージ情報の基本ユニットである。このデータモデルは、以下で詳述するが、ItemおよびItem拡張を宣言し、Item間の関係を確立し、Item FoldersとCategories内にItemを編成するためのメカニズムを備える。
Itemは、単純ファイルとは異なり、ストレージプラットフォームによりエンドユーザまたはアプリケーションプログラムに対し公開されるすべてのオブジェクトにわたって一般的にサポートされるプロパティの基本集合を持つオブジェクトである格納可能情報のユニットである。Itemは、さらに、以下で説明するように、新しいプロパティおよび関係を導入することができる機能を含むすべてのItem型にわたって一般的にサポートされるプロパティおよび関係も有する。
Location Itemは、EAddresses、MetropolitanRegion、Neighborhood、およびPostalAddressesを含む複数のプロパティを持つ。それぞれに対するプロパティの特定の型は、プロパティ名の直後に示され、コロン(「:」)でプロパティ名と区切られる。型名の右には、そのプロパティ型について許された値の個数があり、これは角括弧(「[ ]」)の間に示され、コロン(「:」)の右にあるアスタリスク(「*」)は、未指定および/または無制限の数(「many」)を示す。コロンの右にある「1」は、1つの値がありえることを示す。コロンの左にあるゼロ(「0」)はプロパティがオプションであることを示す(値がまったくない場合もある)。コロンの左にある「1」は、少なくとも1つの値がなければならないことを示す(プロパティは必須である)。NeighborhoodおよびMetropolitanRegionは、両方とも、定義済みのデータ型または「単純型」(また、本明細書では大文字使用でないことにより表される)である、型「nvarchar」(または同等の型)である。しかし、EAddressesおよびPostalAddressesは、それぞれ型EAddressおよびPostalAddressの定義済み型または「複合型」(本明細書では大文字使用で表される)のプロパティである。複合型は、1つまたは複数の単純データ型および/または他の複合型から派生した型である。Itemのプロパティに対する複合型は、さらに、複合型の詳細はそのプロパティを定義するためにイミディエイトItem内にネストされるため「ネストされた要素」も構成し、それらの複合型に関係する情報は、(本明細書な後のほうで説明するように、Itemの境界内の)それらのプロパティを持つItemとともに保持される。型付け(typing)のこれらの概念は、よく知られており、当業者であれば容易に理解できる。
Itemは、ItemIDを持つ大域的アイテム空間(global items space)内で一意に識別される。Base.Item型は、ItemのIDを格納する型GUIDのフィールドItemIDを定義する。Itemは、データストア302内にちょうど1つのIDを持たなければならない。
アイテム参照は、Itemを特定し、識別するための情報を格納するデータ構造体である。データモデルでは、抽象型は、すべてのアイテム参照型の派生元のItemReferenceという名前を持つものとして定義される。ItemReference型は、Resolveという名前の仮想メソッドを定義する。Resolveメソッドは、ItemReferenceを解決して、Itemを返す。このメソッドは、参照が与えられているItemを取り出す関数を実装するItemReferenceの具体的な子型によりオーバーライドされる。Resolveメソッドは、ストレージプラットフォームAPI322の一部として呼び出される。
ItemIDReferenceはItemReferenceの子型である。これは、LocatorおよびItemIDフィールドを定義する。Locatorフィールドは、アイテム領域(domain)に名前を付ける(つまり、識別する)。これは、Locatorの値をアイテム領域に解決することができるロケータ解決メソッドにより処理される。ItemIDフィールドは、ItemID型である。
ItemPathReferenceは、LocatorおよびPathフィールドを定義するItemReferenceの特殊化(specializaiton)である。Locatorフィールドは、アイテム領域を識別する。これは、Locatorの値をアイテム領域に解決することができるロケータ解決メソッドにより処理される。Pathフィールドは、Locatorにより与えられるアイテム領域をルートとするストレージプラットフォーム名前空間内の(相対)パスを含む。
上述の参照形態は、図11に例示されている参照型階層を通じて表される。これらの型から継承する追加参照型は、スキーマで定義することができる。それらは、ターゲットフィールドの型として関係宣言の中で使用することができる。
以下で詳しく説明するが、Itemのグループは、Item Folders(ファイルフォルダと混同すべきでない)と呼ばれる特別なItemに編成されることができる。しかし、大半のファイルシステムとは異なり、Itemは、複数のItem Folderに属すことができ、そのため、Itemが一方のItem Folderでアクセスされ改訂された場合、この改訂されたItemは、他方のItemフォルダから直接アクセスすることができる。本質的に、Itemへのアクセスは異なるItem Foldersから発生しうるが、実際にアクセスされる内容は、事実、まったく同じItemである。しかし、Item Folderは、必ずしも、そのメンバItemのすべてを所有するわけではなく、または単に、他のフォルダとともにItemを共同所有することができ、Item Folderを削除しても、その結果Itemの削除も必ずしも行われるわけではない。しかしながら、本発明のいくつかの実施形態では、Itemは、少なくとも1つのItem Folderに属していなければならず、したがって、特定のItemに対する単独のItem Folderが削除されると、ある実施形態では、Itemは自動的に削除されるか、または他の実施形態では、Itemは自動的に、既定のItem Folder(例えば、様々なファイル−フォルダベースのシステムで使用される類似名フォルダと概念上類似の「Trash Can」Item Folder)のメンバとなる。
a)Base Schema
Itemの作成および使用に普遍的基盤を用意するため、本発明のストレージプラットフォームの様々な実施形態は、Itemおよびプロパティの作成および編成に使用する概念フレームワークを確立するBase Schemaを備える。Base Schemaは、Itemおよびプロパティのいくつかの特殊な型、および子型をさらに派生することができる派生元のこれらの特別な基礎型の特徴を定義する。このBase Schemaを使用することにより、プログラマは、Item(およびそれぞれの型)をプロパティ(およびそれぞれの型)から概念的に区別することができる。さらに、Base Schemaでは、すべてのItem(およびその対応するItem Types)がBase Schema内のこの基礎的なItem(およびその対応するItem Type)から派生するときにすべてのItemが所有することができるプロパティの基礎的な集合を規定する。
本発明のストレージプラットフォームの様々な実施形態は、さらに、最上位レベルのItem型構造の概念フレームワークを提供するCore Schemaを含む。図8Aは、Core Schema内のItemを例示するブロック図であり、図8Bは、Core Schema内のプロパティ型を例示するブロック図である。異なる拡張子(*.com、*.exe、*.bat、*.sysなど)を持つファイルとファイル−フォルダベースのシステムのそのような他の基準を持つファイルとの区別は、Core Schemaの関数に類似している。Core Schemaが、Itemベースのハードウェア/ソフトウェアインターフェースシステムでは、直接的に(Item型により)または間接的に(Item子型により)、すべてのItemを、Itemベースのハードウェア/ソフトウェアインターフェースシステムが理解し、所定の予測可能な方法で直接処理できる1つまたは複数のCore Schema Item型に特徴付ける、コアItem型の集合を定義する。定義済みItem型は、Itemベースのハードウェア/ソフトウェアインターフェースシステム内の最も一般的なItemを反映し、したがって、一定レベルの効率が、Core Schemaを含む定義済みItem型を認識するItemベースのハードウェア/ソフトウェアインターフェースシステムにより得られる。
・ Principal Identity Keys(Base Schema内のIdentityKey型から派生)
・ Postal Address(Base Schema内のProperty型から派生)
・ Rich Text(Base Schema内のProperty型から派生)
・ EAddress(Base Schema内のProperty型から派生)
・ IdentitySecurityPackage(Base Schema内のRelationship型から派生)
・ RoleOccupancy(Base Schema内のRelationship型から派生)
・ BasicPresence(Base Schema内のRelationship型から派生)
これらのItemおよびPropertiesは、さらに、図8Aおよび図8Bで述べられているそれぞれのプロパティにより記述される。
Relationshipsは、一方のItemがソースとして指定され、他方のItemがターゲットとして指定されている2項関係である。ソースItemおよびターゲットItemは、この関係によって関連付けられる。ソースItemは、一般に、関係の存続期間を制御する。つまり、ソースItemが削除されるとそれらのItem間の関係も削除されるということである。
明示的関係型は、以下の要素により定義される。
保持関係は、ターゲットItemの参照カウントベースの存続期間管理をモデル化するために使用される。
Itemは、Itemとの0またはそれ以上の関係に対するソース終点とすることができる。埋め込まれたItemではないItemは、1つまたは複数の保持関係におけるターゲットとすることができる。
ターゲット終点参照型は、ItemIDReferenceでなければならず、また関係インスタンスと同じストア内のItemを参照しなければならない。
保持関係は、Item名前空間を形成する際に重要な役割を果たす。これらは、ソースItemに相対的にターゲットItemの名前を定義する「Name」プロパティを含む。この相対名は、与えられたItemから生じるすべての保持関係について一意である。ルートItemから始まり与えられたItemに至るこの相対名の順序付けされたリストは、Itemに対するフルネームを形成する。
埋め込み関係は、ターゲットItemの存続期間の排他的制御という概念をモデル化する。これらは、複合Itemの概念を有効にする。
関係宣言内で指定される終点Itemの型は、一般的に、関係のインスタンスが作成されるときに強制される。関係が確立された後では、終点Itemの型は変更できない。
埋め込み関係は、ターゲット終点の動作の整合性を制御する。例えば、Itemをシリアライズするオペレーションは、そのItemをソースとするすべての埋め込み関係だけでなく、そのターゲットのすべてのシリアライズをも含むことができ、Itemをコピーすることで、そのすべての埋め込まれているItemもコピーされる。
参照関係は、参照するItemの存続期間を制御しない。さらには、参照関係は、ターゲットの存在を保証せず、また関係宣言内で指定された通りにターゲットの型を保証するわけでもない。これは、参照関係が宙ぶらりんになる可能性のあることを意味している。また、参照関係は、他のデータストア内のItemを参照することができる。参照関係は、Webページ内のリンクに類似の概念として考えることができる。
参照関係は、Item間のほとんどの非存続期間管理関係をモデル化するために使用される。ターゲットの存在は強制されないので、参照関係は、疎結合関係をモデル化するために都合がよい。参照関係は、他のコンピュータ上のストアを含む他のデータストア内のItemをターゲットとするために使用することができる。
以下の追加規則および制約条件を関係について適用する。
1.Itemは、(ちょうど1つの埋め込み関係)または(1つまたは複数の保持関係)のターゲットでなければならない。例外の1つは、ルートItemである。Itemは、0またはそれ以上の参照関係のターゲットとすることができる。
少なくとも一実施形態では、本発明のストレージプラットフォームは、関係の順序付けをサポートする。順序付けは、基本関係定義の中で「Order」という名前のプロパティを通じて実行される。Orderフィールド上には一意性制約条件はない。同じ「順序」プロパティ値を持つ関係の順序は保証されないが、低い「順序」の値を持つ関係の後、および高い「順序」フィールド値を持つ関係の前に、順序付けできることが保証される。
RelFirstは、順序値OrdFirstを持つ順序付きコレクション内の最初の関係である。
RelLastは、順序値OrdLastを持つ順序付きコレクション内の最後の関係である。
RelXは、順序値OrdXを持つコレクション内の与えられた関係である。
RelNextは、順序値OrdNextがOrdXよりも大きい、コレクション内のRelXとの最も近い関係である。
InsertBeforeFirst (SourceItemID, Relationship)
関係を第1の関係としてコレクション内に挿入する。新しい関係の「Order」プロパティの値はOrdFirstよりも小さい場合がある。
InsertAfterLast (SourceItemID, Relationship)
関係を最後の関係としてコレクション内に挿入する。新しい関係の「Order」プロパティの値はOrdLastよりも大きい場合がある。
InsertAt (SourceItemID, ord, Relationship)
「Order」プロパティに対する指定された値を持つ関係を挿入する。
InsertBefore (SourceItemID, ord, Relationship)
与えられた順序値を持つ関係の前に関係を挿入する。新しい関係には、OrdPrevとordの間の、しかもそれを含まない、「Order」値を割り当てることができる。
InsertAfter (SourceItemID, ord, Relationship)
与えられた順序値を持つ関係の後に関係を挿入する。新しい関係には、ordとOrdNextの間の、しかもそれを含まない、「Order」値を割り当てることができる。
MoveBefore (SourceItemID, ord, RelationshipID)
与えられた関係IDを持つ関係を指定された「Order」値を持つ関係の前に移動する。この関係には、OrdPrevとordの間の、しかもそれを含まない、新しい「Order」値を割り当てることができる。
MoveAfter (SourceItemID, ord, RelationshipID)
与えられた関係IDを持つ関係を指定された「Order」値を持つ関係の後に移動する。この関係には、ordとOrdNextの間の、しかもそれを含まない、新しい順序値を割り当てることができる。
前述のRelationshipsは、ItemとそれのItem Folder(s)と間の関係を表すが、ItemからItem Folderに、Item FolderからItemに、またはその両方に論理的に拡張することができる。論理的にItemからItem Folderに拡張するRelationshipは、Item FolderがそのItemに対しパブリックであることを表し、そのItemとの帰属関係情報を共有するが、逆に、ItemからItem Folderへの論理的Relationshipが存在しないことは、Item FolderがそのItemに対しプライベートであり、そのItemとの帰属関係情報を共有しないことを表す。同様に、Item FolderからItemに論理的に拡張するRelationshipは、ItemがそのItem Folderに対しパブリックであり共有可能であることを表すが、Item FolderからItemへの論理的Relationshipが存在しないことは、Itemがプライベートであり、非共有可能であることを表す。したがって、Item Folderは、他のシステムにエクスポートされる場合、新しい文脈で共有される「パブリック」Itemであり、ItemがそのItem Folders内で他の共有可能なItemを検索する場合、それは属する共有可能Itemに関する情報をItemに供給する「パブリック」Item Foldersである。
ストレージプラットフォームに対して、上述のように、スキーマの初期集合(プラットフォームスキーマ)340を与えることが意図されている。しかし、それに加えて、少なくともいくつかの実施形態では、ストレージプラットフォームにより、独立系ソフトウェアベンダ(ISV)を含む顧客は、新しいスキーマ344(つまり、新しいItemおよびNested Element型)を作成することができる。この節では、スキーマの初期集合(プラットフォームスキーマ)340内で定義されているItem型およびNested Element型(または単純に、「Element」型)を拡張することによりそのようなスキーマを作成するためのメカニズムを取りあげる。
ISVは新しいItem型、つまり、子型Base.Itemを導入することが許される。
ISVは新しいNested Element型、つまり、子型Base.NestedElementを導入することが許される。
ISVは新しい拡張、つまり、子型Base.NestedElementを導入することが許される。しかし、
ISVは、ストレージプラットフォームのスキーマの初期集合(プラットフォームスキーマ)340により定義されている型(Item、Nested Element、またはExtension型)をサブタイプ化することはできない。
Item拡張を行うために、データモデルは、さらに、Base.Extensionという名前の抽象型を定義する。これは、拡張型の階層に対するルート型である。アプリケーションでは、Base.Extensionをサブタイプ化して、特定の拡張型を作成することができる。
拡張型はフィールドを持つ。
フィールドは、プリミティブまたはネスト要素型とすることができる。
拡張型は、サブタイプ化することができる。
拡張は、関係のソースおよびターゲットとすることはできない。
拡張型インスタンスは、アイテムから独立しては存在し得ない。
拡張型は、ストレージプラットフォームの型定義でのフィールド型として使用することはできない。
複数の拡張インスタンスは、格納され、アイテムから別々にアクセスされる。すべての拡張型インスタンスは大域的拡張ビューからアクセス可能である。関連するアイテムの型がどうであれ、与えられた拡張の型のすべてのインスタンスを返す効率的なクエリを作成することができる。ストレージプラットフォームAPIは、アイテム上の拡張の格納、取り出し、および修正を行うことができるプログラミングモデルを提供する。
Item型と同様に、Extension型インスタンスは、拡張型に関連付けられているビューを通じて直接アクセスされることが可能である。拡張のItemIDは、どのアイテムに属しているかを示し、これを使用して、大域的Itemビューから対応するItemオブジェクトを取り出すことができる。
拡張は、動作の整合性のためにアイテムの一部と考えられる。ストレージプラットフォームが定義するCopy/Move、Backup/Restore、およびその他の共通オペレーションは、そのアイテムの一部として拡張上で動作することができる。
上記の例では、CRMExtension型のフィールドおよびメソッドは、Contact階層のフィールドまたはメソッドをオーバーライドすることができない。CRMExtension型のインスタンスは、Contact以外のItem型に付随させることができる。
システム内のすべてのCRMExtension拡張は、どのアイテムに属しているか関係なく、CRMExtension型ビューを通じてアクセスすることができる。アイテムのすべてのアイテム拡張は、同じアイテムidを共有する。上記の例では、Contactアイテムインスタンスおよび付随するCRMExtensionおよびHRExtensionは同じItemIDをインスタンス化する。
NestedElement型は、Item型と同じメカニズムで拡張されない。ネストされた要素の拡張は、ネストされた要素型のフィールドと同じメカニズムにより格納され、アクセスされる。
ネストされた要素拡張は、拡張型ではない。それらは、Base.Extension型をルートとする拡張型階層に属さない。
ネストされた要素拡張は、アイテムの他のフィールドとともに格納され、大域的にはアクセス可能でない−与えられた拡張型のすべてのインスタンスを取り出すクエリを作成できない。
多値(multi-valued)プロパティにアクセスするために使用されるコレクションインターフェースも、型拡張の集合についてアクセスおよび反復するために使用される。
上述のように、データストアは、データベースエンジン上に実装される。本発明では、データベースエンジンは、オブジェクトリレーショナル拡張とともに、Microsoft SQL Serverなどの、SQLクエリ言語を実装するリレーショナルデータベースエンジンを含む。この節では、データストアが実装するデータモデルのリレーショナルストアへのマッピングについて説明し、また本発明によるストレージプラットフォームクライアントによって使われる論理APIに関する情報も掲載する。しかし、異なるデータベースエンジンが使用される場合に、異なるマッピングを採用できることは理解されるであろう。実際、ストレージプラットフォームの概念データモデルをリレーショナルデータベースエンジン上に実装することに加えて、さらに、他のタイプのデータベース、例えば、オブジェクト指向およびXMLデータベース上に実装されることも可能である。
本発明の実施形態では、一実施形態においてMicrosoft SQL Serverエンジンを含むリレーショナルデータベースエンジン314は、組み込みスカラー型をサポートする。組み込みスカラー型は「ネイティブ」と「単純(simple)」である。それらは、ユーザが独自の型を定義することはできないという点でネイティブであり、複合構造をカプセル化できないという点で単純である。ユーザ定義型(User-defined types)(これ以降、UDT)は、複合構造型を定義することによりユーザが型システムを拡張できるようにすることによりネイティブのスカラー型システムの上の、またそれを超える、型拡張性のためのメカニズムを提供する。UDTは、ユーザにより定義された後、型システムにおいて組み込みスカラー型が使用できる場所であればどこででも使用することができる。
Itemが大域的に検索可能であることが望ましく、継承および型代替可能性に対する本発明のリレーショナルデータベースでのサポートがあれば、データベースストア内のItemストレージの1つの可能な実装は、すべてのItemを型Base.Itemの列を含む単一テーブルに格納することである。型代替可能性を使用すると、すべての型のItemを格納することが可能になり、またYukonの「is of(Type)」演算子を使用してItem型と子型により検索をフィルタ処理することが可能になる。
Base.Item Base.GetItem (uniqueidentifier ItemID)
Extensionsは、Itemに非常によく似ており、同じ要求条件のうちいくつかを持つ。継承をサポートする他のルート型として、Extensionsはストレージに対する同じ考慮事項とトレードオフの関係の多くの影響を受ける。このため、類似の型族マッピングは、単一テーブルアプローチではなく、むしろ、Extensionsに適用される。もちろん、他の実施形態では、単一テーブルアプローチを使用することが可能である。
Nested Elementsは、深くネストされた構造を形成するためにItem、Extensions、Relationships、または他のNested Elements内に埋め込むことができる型である。ItemおよびExtensionsのように、Nested Elementsは、UDTとして実装されるが、ItemとExtensions内に格納される。したがって、Nested Elementsは、そのItemおよびExtensionコンテナを超えるストレージマッピングを持たない。つまり、NestedElement型のインスタンスを直接格納するテーブルはシステムにはなく、Nested Elements専用のビューもない。
データモデル内の各エンティティ、つまり、各Item、Extension、およびRelationshipは一意のキー値を持つ。Itemは、ItemIDにより一意に識別される。Extensionは、(ItemId,ExtensionId)の複合キーにより一意に識別される。Relationshipは、複合キー(ItemId,RelationshipId)により識別される。ItemId、ExtensionId、およびRelationshipIdはGUID値である。
データストア内に作成されたすべてのオブジェクトは、ストレージプラットフォームスキーマ名から派生されたSQLスキーマ名で格納することができる。例えば、ストレージプラットフォームBaseスキーマ(「Base」と呼ばれることが多い)は、「[System.Storage].Item」などの「[System.Storage]」SQLスキーマで型を生成することができる。生成された名前は、命名の競合をなくすため、修飾子が先頭に付けられる。適宜、感嘆符(!)が、名前の各論理部分の仕切りとして使用される。以下の表は、データストア内のオブジェクトに使用される命名規則の概要である。それぞれのスキーマ要素(Item、Extension、Relationship、およびView)は、データストア内のインスタンスにアクセスするために使用される装飾された命名規則とともに一覧にされている。
オブジェクトモデルをストアにマッピングする場合、アプリケーションオブジェクトとともに追加情報が格納されているため、命名競合が発生する可能性がある。命名競合を回避するため、すべての非型固有列(non-type specific columns)(型宣言で名前付きPropertyに直接マッピングされない列)の先頭に、下線(_)文字を付ける。本発明の実施形態では、下線(_)文字は、識別子プロパティの先頭文字としては禁止されている。さらに、CLRとデータストアとの間の命名法の統一のため、ストレージプラットフォームの型またはスキーマ要素(関係など)のすべてのプロパティは、先頭文字を大文字にしていなければならない。
ビューは、格納されているコンテンツを検索するためストレージプラットフォームにより用意される。SQLビューは、各ItemおよびExtension型について用意されている。さらに、ビューは、RelationshipsとViewsをサポートするためにも用意されている(Data Modelでの定義に従って)。ストレージプラットフォーム内のすべてのSQLビューおよび基礎のテーブルは読み取り専用である。データは、以下に詳述するように、ストレージプラットフォームAPIのUpdate()メソッドを使用して格納または変更することができる。
1.ItemId、ElementId、RelationshipId、...などのビュー結果の(複数の)論理「key」列。
2.TypeIdなどの結果の型に関するメタデータ情報。
3.CreateVersion、UpdateVersion、...などの変更追跡列。
4.(複数の)型特有の列(宣言された型のProperties)
5.型特有のビュー(族ビュー)も、オブジェクトを返すオブジェクト列を含む。
各Item検索ビューは、特定の型またはその子型のItemの各インスタンスに対する1つの行を含む。例えば、Documentに対するビューは、Document、LegalDocument、およびReviewDocumentのインスタンスを返すことができる。この例では、Itemビューは、図28に示されているように概念化することができる。
ストレージプラットフォームのデータストアのそれぞれのインスタンスは、マスターアイテムビューという特別なItemビューを定義する。このビューは、データストア内のそれぞれのItemに関する概要情報を示す。ビューは、Item型プロパティ毎に1つの列を示し、列は、変更追跡および同期情報を供給するために使用されるItemおよび複数の列の型を記述している。マスターアイテムビューは、名前「[System.Storage].[Master!Item]」を使用してデータストア内で識別される。
各Item型は、さらに、検索ビューを持つ。ルートItemビューに似ているが、このビューは、さらに、「_Item」列を介してItemオブジェクトにアクセスできる。各型付きアイテム検索ビューは、名前[schemaName].[itemTypeName]を使用してデータストア内で識別される。例えば、[AcmeCorp.Doc].[OfficeDoc]。
WinFS Store内のすべてのItem Extensionsは、検索ビューを使用してアクセスすることもできる。
データストアのそれぞれのインスタンスは、マスター拡張ビュー(Master Extension View)という特別なExtensionビューを定義する。このビューは、データストア内のそれぞれのExtensionに関する概要情報を示す。ビューは、Extensionプロパティ毎に1つの列を持ち、列は、変更追跡および同期情報を供給するために使用されるExtensionおよび複数の列の型を記述している。マスター拡張ビューは、名前「[System.Storage].[Master!Extension]」を使用してデータストア内で識別される。
各Extension型は、さらに、検索ビューを持つ。マスター拡張ビューに似ているが、このビューは、さらに、_Extension列を介してItemオブジェクトにアクセスできる。各型付き拡張検索ビューは、名前[schemaName].[Extension!extensionTypeName]を使用してデータストア内で識別される。例えば、[AcmeCorp.Doc].[Extension!OfficeDocExt]。
すべてのネストされている要素は、Item、Extensions、またはRelationshipsインスタンス内に格納される。したがって、該当するItem、Extension、またはRelationship検察ビューにクエリを行うことで、これらはアクセスされる。
上述のように、Relationshipsは、ストレージプラットフォームのデータストア内にItem間のリンキングの基本ユニットを形成する。
それぞれのデータストアは、Master Relationship Viewを与える。このビューは、データストア内のすべての関係インスタンスに関する情報を示す。マスター関係ビューは、名前「[System.Storage].[Master!Relationship]」を使用してデータストア内で識別される。
それぞれの宣言されたRelationshipは、さらに、特定の関係のすべてのインスタンスを返す検索ビューを持つ。マスター関係ビューに似ているが、このビューは、さらに、関係データのプロパティ毎に名前付き列を示す。各関係インスタンス検索ビューは、名前[schemaName].[Relationship!relationshipName]を使用してデータストア内で識別される。例えば、[AcmeCorp.Doc].[Relationship!DocumentAuthor]。
ストレージプラットフォームのデータストア内のすべてのビューは読み取り専用である。データモデル要素(アイテム、拡張、または関係)の新しいインスタンスを作成する、または既存のインスタンスを更新するには、ストレージプラットフォームAPIのProcessOperationまたはProcessUpdategramメソッドが使用されなければならない。ProcessOperationメソッドは、実行されるアクションの詳細を決める「オペレーション」を消費するデータストアにより定義された単一のストアドプロシージャである。ProcessUpdategramメソッドは、実行されるアクションの集合の詳細を包括的に決める、「アップデートグラム」と呼ばれる、オペレーションの順序付き集合を受け取るストアドプロシージャである。
1.Itemオペレーション:
a.CreateItem(埋め込みまたは保持関係の文脈において新しいアイテムを作成する)
b.UpdateItem(既存のItemを更新する)
2.Relationshipオペレーション:
a.CreateRelationship(参照または保持関係のインスタンスを作成する)
b.UpdateRelationship(関係インスタンスを更新する)
c.DeleteRelationship(関係インスタンスを削除する)
3.Extensionオペレーション:
a.CreateExtension(既存のItemに拡張を追加する)
b.UpdateExtension(既存の拡張を更新する)
c.DeleteExtension(拡張を削除する)
変更追跡およびツームストーンサービスは、以下で詳述するように、データストアにより提供される。このセクションでは、データストア内に公開された変更追跡情報の概要を述べる。
データストアによって与えられるそれぞれの検索ビューは、変更追跡情報を供給するために使用される列を含み、それらの列は、すべてのItem、Extension、およびRelationshipビュー間で共通である。ストレージプラットフォームのSchema Viewsは、スキーマデザイナにより明示的に定義され、変更追跡情報を自動的に供給することはしない−そのような情報は、ビュー自体が構築される検索ビューを通じて間接的に供給される。
マスター検索ビュー内の変更追跡情報は、要素の作成および更新バージョンに関する情報、要素を作成した同期パートナに関する情報、要素を最後に更新した同期パートナに関する情報、および作成および更新に関する各パートナからのバージョン番号を示す。同期関係にあるパートナ(後述)は、パートナキーにより識別される。型[System.Storage.Store].ChangeTrackingInfoの_ChangeTrackingInfoという名前の単一のUDTオブジェクトがこの情報を格納する。この型は、System.Storageスキーマで定義される。_ChangeTrackingInfoは、Item、Extension、およびRelationshipについてすべての大域的検索デビューで利用可能である。ChangeTrackingInfoの型定義は以下の通りである。
大域的検索ビューと同じ情報を供給することに加えて、それぞれの型付き検索ビューは、同期トポロジ内の各要素の同期状態を記録した追加情報を供給する。
データストアは、Item、Extensions、およびRelationshipsのツームストーン情報を与える。ツームストーンビューは、ある場所にあるライブ状態のエンティティとツームストーン状態のエンティティ(live and tombstoned entities)(アイテム、拡張、および関係)の両方に関する情報を示す。アイテムおよび拡張ツームストーンビューは、対応するオブジェクトへのアクセスを行えないが、関係ツームストーンビューは、関係オブジェクトへのアクセスを行える(関係オブジェクトは、ツームストーン状態の関係の場合にはNULLである)。
アイテムツームストーンは、ビュー[System.Storage].[Tombstone!Item]を介してシステムから取り出される。
拡張ツームストーンは、ビュー[System.Storage].[Tombstone!Extension]を使用してシステムから取り出される。拡張変更追跡情報は、ExtensionIdプロパティの追加を含むItemについて与えられる情報と類似している。
関係ツームストーンは、ビュー[System.Storage].[Tombstone!Relationship]を介してシステムから取り出される。関係ツームストーン情報は、Extensionsについて与えられる情報と類似している。しかし、追加情報は、関係インスタンスのターゲットItemRef上で与えられる。さらに、関係オブジェクトも選択される。
ツームストーン情報の際限のない増殖を防ぐために、データストアは、ツームストーンのクリーンアップタスクを用意している。このタスクは、ツームストーン情報をいつ破棄できるかを決定する。このタスクは、ローカルの作成/更新バージョンに対する限界を計算し、その後、旧いすべてのツームストーンバージョンを破棄することによりツームストーン情報を切り詰める。
Baseマッピングは、さらに、多数のヘルパ関数も備える。これらの関数は、データモデルに対する共通のオペレーションを補助するために用意されている。
a)関数[System.Storage].GetItem
ItemIdを与えられたItemオブジェクトを返す。
//
Item GetItem (ItemId ItemId)
b)関数[System.Storage].GetExtension
//ItemIdおよびExtensionIdを与えられた拡張オブジェクトを返す。
//
Extension GetExtension (ItemId ItemId, ExtensionId ExtensionId)
c)関数[System.Storage].GetRelationship
//ItemIdおよびRelationshipIdを与えられた関係オブジェクトを返す。
//
Relationship GetRelationship (ItemId ItemId, RelationshipId RelationshipId)
ストアで表されるメタデータは、インスタンスメタデータ(Itemの型など)および型メタデータの2種類がある。
a)スキーマメタデータ
スキーマメタデータは、MetaスキーマからのItem型のインスタンスとしてデータストア内に格納される。
b)インスタンスメタデータ
インスタンスメタデータは、Itemの型についてクエリを実行するためにアプリケーションによって使用され、これによりItemに関連付けられている拡張を見つける。Itemに対するItemIdが与えられれば、アプリケーションは、大域的アイテムビューにクエリを実行して、Itemの型を返し、この値を使用して、Meta.Typeビューにクエリを実行し、Itemの宣言された型に関する情報を返す。例えば、以下のようになる。
この節では、一実施形態による、本発明のストレージプラットフォームのセキュリティモデルを説明する。
本発明の実施形態により、ストレージプラットフォームのセキュリティポリシーが指定され強制される精度は、与えられたデータストア内のアイテムに対する様々なオペレーションのレベルにあり、全体とは別にアイテムの一部分をセキュリティ保護する機能はない。セキュリティモデルでは、アクセス制御リスト(ACL)を通じてそれらのオペレーションをアイテムに対し実行するため誰かにアクセス権を付与し、または誰かを拒絶することができるプリンシパルの集まりを指定する。それぞれのACLは、アクセス制御エントリ(ACE)の順序付きコレクションである。
アイテムI上の継承されるすべてのACLのLについて
すべてのアイテムI1、I2について
L内のすべてのACEのA1およびA2について
I1はI2の祖先であり、
I2はI3の祖先であり、
A1はI1から継承されたACEであり、
A2はI2から継承されたACEである
ことが成り立てば、
A2はL内のA1に先行する
アイテムI上の継承されるすべてのACLのLについて
すべてのアイテムI1について
L内のすべてのACEのA1およびA2について
I1はI2の祖先であり、
A1はI1から継承されたACCESS_DENIED_ACEであり、
A2はI1から継承されたACCESS_GRANTED_ACEである
ことが成り立てば、
A1はL内のA2に先行する
Inherited_ACLs(ItemId)−アイテムIDがストア内の親からのItemIdであるアイテムにより継承されるACLの集合。
Explicit_ACL(ItemId)−IDがItemIdであるアイテムについて明示的に定義されているACL。
この節では、セキュリティ記述子内の個々の権利および含まれるACLが様々なオペレーションにどのように影響を及ぼすかを記述することによりアイテムのセキュリティ保護方法の詳細を示す。
セキュリティモデルの詳細を説明する前に、セキュリティ記述子の基本事項を説明すると有益である。セキュリティ記述子は、セキュリティ設定可能なオブジェクトに関連付けられたセキュリティ情報を含む。セキュリティ記述子は、SECURITY_DESCRIPTOR構造体およびその関連付けられたセキュリティ情報からなる。セキュリティ記述子は、以下のセキュリティ情報を含むことができる。
1.オブジェクトの所有者および一次グループに対するSID。
2.特定のユーザまたはグループに対して許可または拒絶されるアクセス権を指定するDACL。
3.オブジェクトに対する監査レコードを生成するアクセスの試行の型を指定するSACL。
4.セキュリティ記述子またはその個別のメンバの意味を限定する制御ビットの集合。
1.ACEが適用される受託者を識別するセキュリティ識別子(SID)。
2.ACEにより制御されるアクセス権を指定するアクセスマスク。
3.ACEの型を示すフラグ。
4.子コンテナまたはオブジェクトが、ACLがアタッチされる一次オブジェクトからACEを継承することができるかどうかを決定するビットフラグの集合。
すべてのセキュリティ設定可能なオブジェクトは、図26に示されているアクセスマスク形式を使用してそのアクセス権を設定する。この形式では、下位16ビットはオブジェクト特有のアクセス権に、次の7ビットは標準アクセス権に使用され、これは、オブジェクトのほとんどの型に適用され、上位4ビットは各オブジェクト型で標準およびオブジェクト特有の権利の集合にマッピングできる汎用アクセス権を指定するために使用される。ACCESS_SYSTEM_SECURITYビットは、オブジェクトのSACLにアクセスする権利に対応する。
汎用アクセス権は、マスク内で上位4ビットで指定される。各タイプのセキュリティ設定可能なオブジェクトは、これらのビットをその標準およびオブジェクト特有のアクセス権の集合にマッピングする。例えば、ファイルオブジェクトは、GENERIC_READビットをREAD_CONTROLおよびSYNCHRONIZE標準アクセス権、およびFILE_READ_DATA、FILE_READ_EA、およびFILE_READ_ATTRIBUTESオブジェクト特有のアクセス権にマッピングする。他のタイプのオブジェクトは、GENERIC_READビットをそのタイプのオブジェクトに適したアクセス権の集合にマッピングする。
それぞれのタイプのセキュリティ設定可能なオブジェクトは、そのタイプのオブジェクトに特有のオペレーションに対応するアクセス権の集合を持つ。それらのオブジェクト特有のアクセス権に加えて、ほとんどのタイプのセキュリティ設定可能なオブジェクトに共通のオペレーションに対応する標準アクセス権の集合がある。以下の表は、標準アクセス権について定義された定数をまとめたものである。
図26のアクセスマスク構造では、アイテム特有の権利は「Object Specific Rights」セクション(下位16ビット)に置かれる。本発明の実施形態では、ストレージプラットフォームは、セキュリティを管理する2組のAPI−Win32およびストレージプラットフォームAPI−を公開しているため、ファイルシステムオブジェクト特有の権利は、ストレージプラットフォーム特有の権利の設計の動機付けをするために考慮されなければならない。
以下の表を考察する。
この権利を使用すると、埋め込まれた関係を介してアイテムにリンクされているアイテムを含むアイテムのすべての要素への読み込みアクセスが可能になる。また、保持関係を介してこのアイテムにリンクされているアイテムの列挙も可能である(ディレクトリリスティングともいう)。これは、参照関係を介してリンクされたアイテムの名前を含む。この権利は以下のようにマッピングされる。
ファイル:
(FILE_READ_DATA|SYNCHRONIZE)
フォルダ:
(FILE_LIST_DIRECTORY|SYNCHRONIZE)
この権利は、ファイルシステムが基本ファイル属性とデータストリームとを区別するのと同様に、Itemの基本属性への読み込みアクセスを可能にする。これらの基本属性は、すべてのアイテムの派生元となる基本アイテム内に配置される属性であるのが好ましい。この権利は以下のようにマッピングされる。
ファイル:
(FILE_READ_ATTRIBUTES)
フォルダ:
(FILE_READ_ATTRIBUTES)
この権利は、ファイルシステムが基本ファイル属性とデータストリームとを区別するのと同様に、Itemの基本属性への書き込みアクセスを可能にする。これらの基本属性は、すべてのアイテムの派生元となる基本アイテム内に配置されるのが好ましい。この権利は以下のようにマッピングされる。
ファイル:
(FILE_WRITE_ATTRIBUTES)
フォルダ:
(FILE_WRITE_ATTRIBUTES)
この権利を使用すると、埋め込まれた関係を介してアイテムにリンクされているアイテムを含むアイテムのすべての要素への書き込みアクセスを実行できるようになる。この権利を使用すると、さらに、埋め込まれた関係を他のアイテムに追加または削除することもできるようになる。この権利は以下のようにマッピングされる。
ファイル:
(FILE_WRITE_DATA)
フォルダ:
(FILE_ADD_FILE)
この権利を使用すると、ストア内のアイテムに保持Relationshipを追加することができるようになる。複数の保持Relationshipのセキュリティモデルはアイテム上のセキュリティを変更し、それらの変更は階層内の上位のポイントから来る場合にWRITE_DACをバイパスすることができるので、それとのRelationshipを作成できるようにするためにWRITE_DACはデスティネーションアイテム上に必要であることに留意されたい。この権利は以下のようにマッピングされる。
ファイル:
(FILE_APPEND_DATA)
フォルダ:
(FILE_ADD_SUBDIRECTORY)
この権利により、アイテムに対する保持Relationshipを削除する機能は、そのアイテムを削除する権利がプリンシパルに付与されていないとしても使用可能になる。これは、ファイルシステムモデルと整合しており、パージに役立つ。この権利は以下のようにマッピングされる。
ファイル:
(FILE_DELETE_CHILD)−ファイルシステムは、この権利に相当するファイルを持たないが、アイテムは他のアイテムとの保持Relationshipを持つという概念はあり、したがって、非フォルダに対しても同様にこの権利を伝えられる。
フォルダ:
(FILE_DELETE_CHILD)
アイテムとの最後の保持Relationshipが消えると、アイテムは削除される。アイテムを削除するという明示的な概念はない。アイテムとのすべての保持Relationshipを削除するが、高水準の機能であってシステムプリミティブではないパージオペレーションがある。
アイテムは、対象がアイテムに対するWinFSItemReadおよびデスティネーションフォルダに対するWinFSItemWriteを付与された場合に、ソースからデスティネーションフォルダにコピーすることができる。
ファイルシステム内のファイル移動は、デスティネーション上でACLを保持するので、ソースファイルに対するDELETE権利およびデスティネーションディレクトリに対するFILE_ADD_FILEだけを必要とする。しかし、フラグは、クロスボリューム移動(cross−volume move)の場合にCopyFileの意味を許容できることをアプリケーションに指定させるMoveFileEx呼び出し(MOVEFILE_COPY_ALLOWED)で指定することができる。移動するとセキュリティ記述子に何が生じるかについて可能な4つの選択肢がある。
1.ACL全体をファイルとともに搬送する−既定のイントラボリューム移動(intra−volume move)の意味。
2.ACL全体をファイルとともに搬送し、保護されているというマークをACLに付ける。
3.デスティネーション間で明示的なACEだけを搬送し、デスティネーション上で再継承する。
4.何も搬送せず、デスティネーション上で再継承する−既定のインターボリューム移動の意味−ファイルのコピーと同じ。
アイテムのセキュリティは、そのアイテムが標準の権利READ_CONTROLを対象に付与する場合に表示できる。
アイテムのセキュリティは、そのアイテムが標準の権利WRITE_DACを対象に付与する場合に変更できる。しかし、データストアは暗黙の継承を提供するので、これは、階層上でのセキュリティの変更方法に密接に関係している。階層のルートがWRITE_DACを付与する場合、セキュリティポリシーは、階層(またはDAG)内の特定のアイテムがWRITE_DACを対象に付与するかどうかに関係なく階層全体で変更されるというのが規則である。
本発明の実施形態では、FILE_EXECUTE(ディレクトリのFILE_TRAVERSE)はストレージプラットフォーム内に直接の等価物を持たない。モデルは、Win32との互換性のためこれらを保持しているが、それらの権利に基づいてアイテムに対しアクセス決定が下されることはない。FILE_READ/WRITE_EAの場合のように、データストアアイテムは、拡張属性の概念を持たないため、このビットに対する意味は用意されていない。しかし、このビットは、Win32の互換性のために残されている。
まったく同じように保護されている領域を定義するすべてのアイテムは、セキュリティテーブル内でそれらに関連付けられたエントリを持つ。セキュリティテーブルは、次のように定義される。
アイテムがコンテナ内に新たに作成されると、これは、コンテナに関連付けられたすべてのACLを継承する。新たに作成されたアイテムは、ちょうど1つの親を持つので、その親と同じ領域に属す。したがって、新しいエントリをセキュリティテーブル内に作成する必要はない。
ACLがアイテムに追加された場合、これは、与えられたアイテム自体と同じセキュリティ領域に属す包含階層内のすべての子孫に対し新しいセキュリティ領域を定義する。他のセキュリティ領域に属しているが包含階層内の与えられたアイテムの子孫ではないすべてのアイテムについて、セキュリティ領域は、変更されないが、その領域に関連付けられている有効なACLは、新しいACLの追加を反映するように変更される。
保持Relationshipがアイテムに追加されると、3つの可能性のうちの1つが生じる。保持Relationshipのターゲット、つまり、考察対象のアイテムがセキュリティ領域のルートである場合、その領域に関連付けられる有効なACLは変更され、セキュリティテーブルにさらに修正を加える必要はない。新しい保持Relationshipのソースのセキュリティ領域がアイテムの既存の親のセキュリティ領域と同じである場合、変更は不要である。しかし、アイテムが異なるセキュリティ領域に属する親を持たないようになれば、新しいセキュリティ領域が形成され、与えられたアイテムをセキュリティ領域のルートとして持つ。この変更は、そのアイテムに関連付けられているセキュリティ領域を修正することにより包含階層内のすべてのアイテムに伝搬される。考察対象のアイテムと同じセキュリティ領域に属するすべてのアイテムおよび包含階層内のその子孫は、変更される必要がある。変更が行われた後、複数の保持Relationshipを持つすべてのアイテムは、さらに変更が必要かを判定するために調べられなければならない。これらのアイテムのどれかが異なるセキュリティ領域の親を持つ場合には、さらに変更が必要になることがある。
保持Relationshipがアイテムから削除された場合、いくつかの条件が満たされていれば、セキュリティ領域をその親領域とともに縮小することが可能である。より正確に言うと、これは、(1)保持Relationshipを削除すると1つの親を持つアイテムが生じ、そのアイテムについて明示的なACLが指定されていない、(2)保持Relationshipを削除すると親がすべて同じセキュリティ領域内にあるアイテムが生じ、そのアイテムについて明示的なACLが定義されていないという条件の下で実行することができる。これらの状況の下で、セキュリティ領域は、親と同じになるようにマーキングすることができる。このマーキングは、セキュリティ領域が縮小される領域に対応するすべてのアイテムに適用する必要がある。
明示的なACLがアイテムから削除された場合、その親の領域とともにそのアイテムをルートとするセキュリティ領域を縮小することが可能である。より正確に言うと、これは、明示的なACLを削除すると包含階層内の親が同じセキュリティ領域に属しているアイテムが生じる場合に実行できる。これらの状況の下で、セキュリティ領域は、親と同じになるようにマーキングすることができ、変更は、セキュリティ領域が縮小される領域に対応するすべてのアイテムに適用される。
このシナリオでは、セキュリティテーブルに新しい追加を行う必要はない。その領域に関連付けられている有効なACLは更新され、新しいACLの変更がそれの影響を受けるセキュリティ領域に伝搬される。
本発明の他の態様によれば、ストレージプラットフォームは、データ変更をアプリケーションで追跡できるようにする通知機能を備える。この機能は、主に、揮発性状態を維持するか、またはデータ変更イベントに関するビジネスロジックを実行するアプリケーション向けである。アプリケーションは、アイテム、アイテム拡張、およびアイテム関係に関する通知を登録する。通知は、データ変更がコミットされた後に非同期に送り出される。アプリケーション側では、アイテム、拡張、および関係型さらにオペレーションの種類により、通知をフィルタ処理することができる。
この節では、ストレージプラットフォームAPI 322により提供される通知インターフェースのいくつかの使用例を取りあげる。
Item、ItemExtensions、およびItemRelationshipsは、データ変更通知の登録のためアプリケーションにより使用されるデータ変更イベントを公開する。以下のコードサンプルは、基本Itemクラス上のItemModifiedおよびItemRemovedイベントハンドラの定義を示している。
本発明の実施形態では、ストレージプラットフォームは、(1)フォルダまたはフォルダ階層、(2)アイテムコンテクスト、または(3)特定のアイテムに関連付けられているオブジェクトを監視するウォッチャクラスを定義する。3つのカテゴリのそれぞれについて、ストレージプラットフォームは、関連付けられているアイテム、アイテム拡張、またはアイテム関係を監視する特定のウォッチャクラスを提供し、例えばストレージプラットフォームは、それぞれのFolderItemWatcher、FolderRelationshipWatcher、およびFolderExtensionWatcherクラスを提供する。
ストレージプラットフォームは、データ変更を追跡し、通知を生成する単純ではあるが効率的なメカニズムを備える。クライアントは、データを取り出すために使用されるのと同じ接続で通知を取り出す。このため、セキュリティチェックが大幅に簡素化され、可能なネットワーク構成に対する待ち時間および制約条件が排除される。通知は、selectステートメントを発行することにより取り出される。ポーリングを行わないようにするために、クライアントは、データベースエンジン314が備える「waitfor」機能を使用することができる。図13は、基本的なストレージプラットフォーム通知概念を示している。このwaitforクエリは、同期して実行される場合、呼び出し側スレッドは、結果が得られるまでブロックされ、非同期に実行される場合、スレッドはブロックされず、結果は用意されれば、別のスレッドで返される。
1)即時イベント検出:イベント検出およびサブスクリプションマッチングは、更新トランザクションの一部として実行される。通知は、サブスクライバにより監視されるテーブル内に挿入される。
2)遅延イベント検出:イベント検出およびサブスクリプションマッチングは、更新トランザクションがコミットされた後に実行される。その後、実際のサブスクライバまたは媒介物がイベントを検出し、通知を生成する。
すべてのアイテム、拡張、およびアイテム関係定義は、一意的な識別子を伝える。変更追跡では、すべてのデータアイテムの作成、更新、および削除時刻を記録する論理的タイムスタンプの集合を維持する。ツームストーンエントリを使用して、削除済みデータアイテムを表す。
論理的タイムスタンプは、データベースに対し「ローカル」である、つまり、ストレージプラットフォームボリュームである。タイムスタンプは、単調増加の64ビット値である。単一のタイムスタンプを保持することは、ストレージプラットフォームボリュームに最後に接続した後データ変更が発生したかどうかを検出するのに十分であることが多い。しかし、最も現実的なシナリオでは、重複のチェックのためさらにいくつかのタイムスタンプを保持する必要がある。理由について以下で説明する。
データストアのクエリを実行するときに、アプリケーションは低ウォーターマークを取得する。その後、アプリケーションはそのウォーターマークを使用して、作成、更新、または削除タイムスタンプが返された低ウォーターマークよりも大きいエントリがないかデータストアをスキャンする。図15は、このプロセスを例示している。
本発明の別の態様によれば、ストレージプラットフォームは、(i)ストレージプラットフォーム(それぞれ自データストア302を備える)の複数のインスタンスが柔軟な規則の集まりに従ってその内容の部分の同期をとれるようにし、(ii)本発明のストレージプラットフォームのデータストアと専用プロトコルを実装する他のデータソースとの同期をとるサードパーティ用のインフラストラクチャを備える同期サービス330を提供する。
・ 他のレプリカがどの変更を認識するかを決定する。
・ このレプリカが認識しない変更に関する情報を要求する。
・ 他のレプリカが認識しない変更に関する情報を伝達する。
・ 2つの変更がいつ互いに競合するかを決定する。
・ 変更をローカルで適用する。
・ 競合する解決を他のレプリカに伝達し、収束を保証する。
・ 競合する解決に対する指定されたポリシーに基づき競合状態を解決する。
本発明のストレージプラットフォームの同期処理サービス330の主要な適用は、ストレージプラットフォームの複数のインスタンスの同期をとることである(それぞれ、自データストアを有する)。同期処理サービスは、ストレージプラットフォームのスキーマレベルで動作する(データベースエンジン314の基礎のテーブルではなく)。したがって、例えば、「Scopes」は、後述のように同期を定義するために使用される。
どのアプリケーションも、同期処理サービスに接続し、同期処理オペレーションを開始することができる。そのようなアプリケーションは、同期処理を実行するために必要なすべてのパラメータを用意する(以下のsyncプロファイルを参照)。このようなアプリケーションは、本明細書では、同期制御アプリケーション(SCA)と呼ばれる。
同期処理サービスの基本概念は、Change Unitの概念である。Change Unitは、ストレージプラットフォームにより個別に追跡されるスキーマの最小断片である。すべてのChange Unitについて、同期処理サービスは、最後のsync以降に変化したか、変化しなかったかを判別することができる。
データの特定の部分の同期を維持したいストレージプラットフォームパートナのグループは、syncコミュニティと呼ばれる。コミュニティのメンバが同期を維持したい場合、必ずしも、まったく同じ方法でデータを表すわけではない、つまり、syncパートナは、同期処理をしているデータを変換することができる。
コミュニティフォルダマッピングは、個々のマシン上にXML構成ファイルとして格納される。それぞれのマッピングは、以下のスキーマを持つ。
/mappings/communityFolder
この要素は、このマッピングの対象となるコミュニティフォルダの名前を指定する。名前はフォルダの構文規則に従う。
/mappings/localFolder
この要素は、このマッピングの変換先のローカルフォルダの名前を指定する。名前はフォルダの構文規則に従う。フォルダは、マッピングが有効であるためにすでに存在していなければならない。このフォルダ内のアイテムは、このマッピングに従って同期対象とみなされる。
/mappings/transformations
この要素は、アイテムをコミュニティフォルダからローカルフォルダに、またその逆方向に変換する方法を定義する。存在しないか、または空の場合、変換は実行されない。特に、これは、IDがマッピングされないことを意味する。この構成は、主に、Folderのキャッシュを作成する際に使用される。
/mappings/transformations/mapIDs
この要素は、コミュニティIDを再利用するのではなく、新しく生成されたローカルIDがコミュニティフォルダからマッピングされたアイテムのすべてに割り当てられることを要求する。Sync Runtimeは、アイテムの変換、逆変換を行うIDマッピングを保持する。
/mappings/transformations/localRoot
この要素は、コミュニティフォルダ内のすべてのルートアイテムが指定されたルートの子にされることを要求する。
/mappings/runAs
この要素は、このマッピングに対する要求が処理される際の権限を制御する。存在しない場合、送信者が想定される。
/mappings/runAs/sender
この要素が存在すると、このマッピングへのメッセージの送信者は、偽装され、要求はその信用証明書に従って処理されなければならない。
同期プロファイル(Sync Profile)は、同期をキックオフするために必要なパラメータ一式である。これは、SCAにより、同期処理を開始するためSync Runtimeに供給される。ストレージプラットフォーム同士の同期をとるための同期プロファイルは、以下の情報を含む。
・ Local Folder、変更の送り元および送り先として使用される。
・ 同期をとるRemote Folder名−このFolderは、上で定義された通りにマッピングを使用してリモートパートナからパブリッシュされなければならない。
・ Direction−同期処理サービスは、送信のみ、受信のみ、および送受信同期をサポートする。
・ Local Filter−リモートパートナに送信するローカル情報を選択する。ローカルフォルダに対するストレージプラットフォームクエリとして表される。
・ Remote Filter−リモートパートナから取り出すリモート情報を選択する−コミュニティフォルダに対するストレージプラットフォームクエリとして表される。
・ Transformations−ローカル形式のアイテムの変換方法を定義する。
・ ローカルセキュリティ−リモート終点から取り出された変更がリモート終点(偽装)の許可を得て適用するか、またはローカルで同期を開始したユーザの許可を得て適用するかを指定する。
・ 競合解決ポリシー−競合が拒絶されるか、ログに記録されるか、または自動的に解決されるかを指定する−後者の場合、使用する競合リゾルバとともにそれに対する構成パラメータを指定する。
一実施形態では、同期処理サービスは、それ専用のスケジューリングインフラストラクチャを用意しない。その代わりに、このタスクを実行するために他のコンポーネントに頼る−Microsoft Windows(登録商標)オペレーティングシステムに付属するWindows(登録商標)Schedulerを使用する。同期処理サービスは、SCAとして動作し、XMLファイルに保存されている同期プロファイルに基づいて同期をトリガするコマンドラインユーティリティを備える。このユーティリティを使用すると、スケジュールに従って、またはユーザがログオンまたはログオフするなどのイベントへの応答として同期処理を実行するようにWindows(登録商標)Schedulerを非常に簡単に構成できる。
同期処理サービスにおける競合回避処理は、(1)変更適用時に実行される、競合検出−このステップでは、変更が安全に適用可能か判別する、(2)自動競合解決およびログ記録−このステップでは(競合が検出された直後に実行される)、競合を解決できるか自動競合リゾルバに問い合わせがゆき、できなればオプションで競合をログに記録できる、および(3)競合検査および解決−このステップは、何らかの競合がログに記録されている場合に実行され、同期セッションの状況の外部で実行されるが、このときに、ログに記録された競合は解決され、ログから削除されるようにできる−の3つの段階に分けられる。
本発明の実施形態では、同期処理サービスは、知識ベースと制約ベースの2種類の競合を検出する。
知識ベースの競合は、2つのレプリカが同じChange Unitに対し独立の変更を加えたときに発生する。2つの変更は、それらが互いの変更を関知せずに行われる場合に独立して呼び出される−つまり、第1のバージョンは、第2のバージョンについての知識の対象とならず、またその逆もいえる。同期処理サービスは、上述のように、レプリカの知識に基づいてそのようなすべての競合を自動的に検出する。
一緒に適用された場合に独立の変更が完全性制約に違反する場合がある。例えば、2つのレプリカが同じディレクトリ内に同じ名前を持つファイルを作成しようとすると、そのような競合が発生するおそれがある。
競合が検出されると、同期処理サービスは、(1)変更を拒絶し、それを送信者に送り返すアクション、(2)競合を競合ログに記録するアクション、または(3)競合を自動的に解決する3つのアクションのうちの1つ(同期プロファイル内の同期イニシエータにより選択される)を実行することができる。
同期処理サービスは、多数の既定の競合リゾルバを備える。このリストは以下のものを含む。
・ local−wins:ローカルに格納されているデータとの競合がある場合に受け取った変更を破棄する。
・ remote−wins:受け取った変更との競合がある場合にローカルデータを破棄する。
・ last−writer−wins:変更のタイムスタンプに基づき変更ユニットに従ってlocal−winsまたはremote−winsのいずれかを選択する(同期処理サービスは、一般に、クロック値に依存しないことに注意されたい。この競合リゾルバはその規則に対する唯一の例外である)。
・ Deterministic:すべてのレプリカ上で同じであることを保証される方法で勝利者を選択するが、他の方法では意味がない−同期処理サービスの一実施形態では、この機能を実装するためにパートナIDの辞書式比較を使用する。
非常に特殊な競合リゾルバとして、Conflict Loggerがある。同期処理サービスは、競合を型ConflictRecordのItemとしてログに記録する。これらの記録は、競合が生じているアイテムに再び関係する(アイテム自体が削除されていない限り)。それぞれの競合記録は、競合を引き起こした受け取った変更、競合のタイプ、更新−更新、更新−削除、削除−更新、挿入−挿入、または制約、および受け取った変更のバージョンとそれを送信するレプリカの知識を含む。ログに記録された競合は、後述のように、検査および解決のために使用できる。
同期処理サービスは、アプリケーション側で競合ログを調べ、その中の競合の解決を提案するためのAPIを備えている。このAPIにより、アプリケーションは、すべての競合、または与えられたItemに関係する競合を列挙することができる。これにより、さらに、そのようなアプリケーションは、ログに記録された競合を解決するために、(1)remote wins−ログに記録された変更を受け入れ、競合しているローカルの変更を上書きする、(2)local wins−ログに記録された変更の競合部分を無視する、および(3)suggest new change−アプリケーションが、オプションにより、競合を解決するマージを提案する場合、の3つの方法のうちの1つを使用することができる。アプリケーションにより競合が解決された後、同期処理サービスはそれらをログから削除する。
複雑な同期シナリオでは、同じ競合が複数のレプリカで検出される場合がある。このような状況が生じた場合、以下のイベントが発生する。(1)競合が一方のレプリカで解決され、その解決が他方のレプリカに送られるようにすることができるか、または(2)競合が両方のレプリカ上で自動的に解決されるか、または(3)競合が両方のレプリカで手動で解決される(競合検査APIを通じて)。
本発明のストレージプラットフォームの他の態様によれば、ストレージプラットフォームは、ISVが、ストレージプラットフォームとMicrosoft Exchange、AD、Hotmailなどの従来システムとを同期させるSync Adaptersを実装するためのアーキテクチャを備える。Sync Adaptersは、後述のように、同期処理サービスにより提供される多くのSync Serviceを利用する。
同期処理サービスは、多数の同期処理サービスをアダプタ作成者に提供する。このセクションの残り部分では、ストレージプラットフォームが同期処理を実行しているマシンを「クライアント」と呼び、アダプタの通信先の非ストレージプラットフォームバックエンドを「サーバ」と呼ぶと都合がよい。
Change Enumerationを使用すると、同期処理サービスにより保持されている変更追跡データに基づき、同期処理アダプタは、データストアFolderに対しこのパートナとの同期が最後に試みられた以降に発生した変更を簡単に列挙することができる。
Change Applicationを使用すると、Sync Adapters側でバックエンドから受け取った変更をローカルストレージプラットフォームに適用することができる。アダプタは、変更をストレージプラットフォームスキーマに変換することが期待される。
上述のConflict Resolutionメカニズム(ログ記録および自動解決オプション)も、同期処理アダプタで利用できる。同期処理アダプタは、変更を適用する場合に競合解決のポリシーを指定することができる。指定した場合、競合は、指定された競合ハンドラに受け渡され、解決されるようにできる(可能ならば)。競合をログに記録することもできる。アダプタは、ローカル変更をバックエンドに適用しようと試みる際に競合を検出する可能性がある。このような場合、アダプタは、それでも、Sync Runtimeにその競合を受け渡し、ポリシーに従って解決することができる。さらに、同期処理アダプタは、同時処理サービスにより検出された競合が処理のため送り返されるように要求することもできる。これは、バックエンドが競合を格納または解決することができる場合に便利である。
いくつかの「アダプタ」が単に、ランタイムインターフェースを使用するアプリケーションである場合には、アダプタ側で標準アダプターインターフェースを実装することが奨励される。これらのインターフェースを使用することにより、Sync Controlling Applicationsは、与えられた同期プロファイルに従ってアダプタが同期処理を実行するよう要求し、進行中の同期処理をキャンセルし、進行中の同期に関する進行中報告(完了率)を受け取ることができる。
同期処理サービスは、ストレージプラットフォームにより実装されたセキュリティモデルに導入するものをできるだけ少なくしようとする。同期処理のための新しい権利を定義するのではなく、既存の権利が使用される。特に、
・ データストアのItemを読み込める人は誰でも、そのアイテムへの変更を列挙することができ、
・ データストアのItemに書き込める人は誰でも、そのアイテムに変更を適用することができ、
・ データストアのItemを拡張できる人は誰でも、そのアイテムに同期メタデータを関連付けることができるということである。
レプリカの分散コミュニティの監視は複雑な問題である。同期処理サービスは、「スイープ」アルゴリズムを使用して、レプリカのステータスに関する情報を収集し分配することができる。スイープアルゴリズムの特性は、構成されたすべてのレプリカに関する情報は、最終的に回収されること、および失敗(非応答)レプリカが検出されることを保証する。
上述のように、本発明のストレージプラットフォームは、少なくとも一部の実施形態では、コンピュータシステムのハードウェア/ソフトウェアインターフェースシステムのなくてはならない一部として具現化されることを意図されている。例えば、本発明のストレージプラットフォームは、Microsoft Windows(登録商標)ファミリのオペレーティングシステムなどのオペレーティングシステムの重要な一部として具現化されることができる。その適応力において、ストレージプラットフォームAPIは、アプリケーションプログラムがオペレーティングシステムとやり取りするために使用するオペレーティングシステムAPIの一部となる。そのため、ストレージプラットフォームは、アプリケーションプログラムがオペレーティングシステムに関する情報を格納するために使用する手段となり、したがって、ストレージプラットフォームのItemベースのデータモデルは、そのようなオペレーティングシステムの従来のファイルシステムの代替えとなる。例えば、Microsoft Windows(登録商標)ファミリのオペレーティングシステムで具現化されているように、ストレージプラットフォームでは、そのオペレーティングシステムで実装されているNTFSファイルシステムを置き換えることも可能である。今のところ、アプリケーションプログラムは、Windows(登録商標)ファミリのオペレーティングシステムにより公開されているWin32 APIを通じてNTFSファイルシステムのサービスにアクセスする。
本発明のこの態様によれば、上述の例示的な実施形態において、ストレージプラットフォームは、非ファイルアイテムおよびファイルアイテムを編成できる1つの名前空間を実装する。このモデルを使用すると、以下の利点が得られる。
1.データストア内のフォルダは、ファイルアイテムおよび非ファイルアイテムの両方を含むことができ、それにより、ファイルおよび図式化されたデータの単一の名前空間を提示できる。さらに、すべてのユーザデータに対する一様なセキュリティ、共有、および管理モデルも実現する。
2.ファイルおよび非ファイルアイテムは両方ともストレージプラットフォームAPIを使用してアクセス可能であり、このアプローチではファイルに対し特別な規則は何も適用されず、アプリケーション開発者がかかわるよりきれいなプログラミングモデルを提示する。
3.すべての名前空間オペレーションは、ストレージプラットフォームを通過し、したがって、同期的に取り扱われる。深いプロパティ格上げ(deep property promotion)(ファイルコンテンツから追い出される)はまだ非同期に発生するが、同期オペレーションではユーザおよびアプリケーションにとってかなり予測可能な環境が得られることに注意することが重要である。
望むレベルの相互運用性を実現するために、一実施形態では、ストレージプラットフォームの以下のデータストア機能が実装される。
ストレージプラットフォームのデータストアは、独立したファイルシステムボリュームとして公開されない。ストレージプラットフォームでは、NTFS上で直接ホスティングされるFILESTREAMを利用する。そのため、ディスク上フォーマットに変更はなく、それにより、ストレージプラットフォームをボリュームレベルで新しいファイルシステムとして公開する必要がなくなる。
ストアの構造は、実施例を見ると最もよくわかる。例えば、図16に例示されているような、HomeMachineという名前のマシンのシステムボリューム上のディレクトリツリーを考える。本発明のファイルシステム相互運用性機能により、c:\ドライブに対応して、例えば、「WinFSOnC」と呼ばれる、UNC共有を介してWin32 APIに公開されるストレージプラットフォームのデータストアがある。これにより、UNC名\\HomeMachine\WinFSOnCを介して関連付けられたデータストアにアクセスできるようになる。
ユーザデータに対応する、またはストレージプラットフォームが備える検索および分類機能を必要とするファイルは、ストレージプラットフォームのデータストアにマイグレートすべき対象候補となる。アプリケーションプログラムとストレージプラットフォームとの互換性の問題を限定するために、本発明のストレージプラットフォームにマイグレートされるファイルの集合は、Microsft Windows(登録商標)オペレーティングシステムが使用されている状況では、Documents and Settingsディレクトリ内のMyDocumentsフォルダ、Internet Explorer(IE)Favorites、IE History、およびDesktop.iniファイル内のファイルに限定されるのが好ましい。Windows(登録商標)システムファイルのマイグレートは許されないことが好ましい。
本明細書で説明されている実施形態では、ストレージプラットフォームにマイグレートされたファイルは、実線のファイルストリームがNTFSに格納されるとしても、NTFS名前空間を介してアクセスされないことが望ましい。こうすることで、多角的な実装から生じる考慮すべきロックおよびセキュリティの複雑な問題が回避される。
ストレージプラットフォーム内のファイルおよびフォルダへのアクセスは、\\<マシン名>\<WinfsShareName>の形式のUNC名を介して実行される。オペレーションにドライブ文字を必要とするアプリケーションのクラスについては、ドライブ文字をこのUNC名にマッピングすることができる。
上述のように、ストレージプラットフォームは、アプリケーションプログラム側で上述のストレージプラットフォームの機能および能力にアクセスし、データストアに格納されているアイテムにアクセスするために使用できるAPIを備える。このセクションでは、本発明のストレージプラットフォームのストレージプラットフォームAPIの一実施形態について説明する。
本発明のストレージプラットフォームAPIのこの実施形態のデータアクセスメカニズムでは、クエリ、ナビゲーション、アクション、イベントの4つの領域を取り扱う。
一実施形態では、ストレージプラットフォームのデータストアは、リレーショナルデータベースエンジン314上に実装され、その結果、SQL言語の完全な表現力がストレージプラットフォームに内在する。より高い水準のクエリオブジェクトにより、ストアへのクエリを実行する簡素化されたモデルが実現されるが、ストレージの完全な表現力をカプセル化することはできない。
ストレージプラットフォームデータモデルは、基礎となるデータベース抽象化の上にリッチな拡張可能型システムを構築する。開発者にとっては、ストレージプラットフォームデータはクモの巣状に巡らされたアイテムである。ストレージプラットフォームAPIを使用することにより、フィルタ処理、関係、フォルダなどを介してアイテムからアイテムへのナビゲーションが可能になる。これは、基本SQLクエリよりも高い水準の抽象化であり、それと同時に、リッチなフィルタ処理およびナビゲーション機能をおなじみのCLRコーディングパターンとともに使用することができる。
ストレージプラットフォームAPIは、すべてのアイテムに対する共通アクション−Create、Delete、Update−を公開し、これらは、オブジェクト上のメソッドとして公開される。さらに、SendMail、CheckFreeBusyなどのドメイン固有のアクションもメソッドとして利用可能である。APIフレームワークでは、追加アクションを定義することにより値を加えるためにISVで使用できる適切に定義されたパターンを使用する。
ストレージプラットフォーム内のデータは、動的である。ストア内のデータが変更されたときにアプリケーションに反応させるために、このAPIではリッチイベンティング、サブスクリプション、および通知機能を開発者に公開する。
名前空間と命名とを区別すると好都合である。名前空間という用語は、通常使用されている用法では、あるシステム内で使用可能なすべての名前の集合を指す。このシステムは、XMLスキーマ、プログラム、Web、すべてのftpサイト(およびそのコンテンツ)の集合などとすることが可能である。命名は、名前空間内の注目するすべてのエンティティに一意的な名前を割り当てるために使用されるプロセスまたはアルゴリズムである。したがって、命名は、名前空間内の与えられたユニットを明確に参照することが望ましいため重要である。したがって、本明細書で使用されているように用語「名前空間」は、ユニバース内のすべてのストレージプラットフォームのインスタンスで使用可能なすべての名前の集合を指す。アイテムは、ストレージプラットフォーム名前空間内の名前付きエンティティである。UNC命名規約を使用して、アイテム名の一意性を保証する。ユニバース内のすべてのストレージプラットフォームのデータストアの中のすべてのアイテムは、UNC名でアドレス指定することが可能である。
ItemContextは、指定されたパス内に存続するItemに返される結果を制限することによりクエリ(例えば、Findオペレーション)のスコープを設定する。
図20は、本発明のこの実施形態による、ストレージプラットフォームAPIの様々なコンポーネントの概略を表している。ストレージプラットフォームAPIは、(1)ストレージプラットフォーム要素およびアイテム型を表す、データクラス2002、(2)オブジェクト永続性を管理し、サポートクラス2006を提供する、ランタイムフレームワーク2004、および(3)ストレージプラットフォームスキーマからCLRクラスを生成するために使用される、ツール2008の各コンポーネントからなる。
本発明の一態様によれば、ストレージプラットフォームのデータストア内のそれぞれのItem、Item Extension、およびElement型は、それぞれのRelationshipとともに、ストレージプラットフォームAPI内に対応するクラスを持つ。おおざっぱに言うと、その型のフィールドは、そのクラスのフィールドにマッピングされるということである。ストレージプラットフォーム内のそれぞれのアイテム、アイテム拡張、および要素は、ストレージプラットフォームAPI内の対応するクラスのオブジェクトとして使用することができる。開発者は、それらのオブジェクトに対するクエリ、作成、修正、または削除を行うことができる。
それぞれのスキーマSについて、
S内のそれぞれのItem Iについて、System.Storage.S.Iという名前のクラスが生成される。このクラスは以下のメンバを持つ。
・ 新しいアイテムの初期フォルダおよび名前を指定するために使用されるコンストラクタを含む、オーバーロードされたコンストラクタ。
・ I内のそれぞれのフィールドのプロパティ。フィールドが多値の場合、プロパティは、対応するElement型のコレクションになる。
・ フィルタとマッチする複数のアイテムを見つけるオーバーロードされた静的メソッド(例えば、「FindAll」という名前のメソッド)。
・ フィルタとマッチする単一のアイテムを見つけるオーバーロードされた静的メソッド(例えば、「FindOne」という名前のメソッド)。
・ idを与えられたアイテムを見つける静的メソッド(例えば、「FindByID」という名前のメソッド)。
・ ItemContextに関して名前を与えられたアイテムを見つける静的メソッド(例えば、「FindByName」という名前のメソッド)。
・ アイテムへの変更を保存するメソッド(例えば、「Update」という名前のメソッド)。
・ アイテムの新しいインスタンスを作成するオーバーロードされた静的なCreateメソッド。これらのメソッドを使用することにより、アイテムの初期フォルダを様々な方法で指定することができる。
・ E内のそれぞれのフィールドのプロパティ。フィールドが多値の場合、プロパティは、対応するElement型のコレクションになる。
・ コレクションがソースロール内に出現するアイテムを暗黙のうちに含むフィルタにマッチする複数のItemオブジェクトを見つけるオーバーロードされたメソッド。これらのオーバーロードは、Item子型に基づいてフィルタ処理を行えるものを含む(例えば、「FindAllTargetItem」という名前のメソッド)。
・ コレクションがソースロール内に出現するアイテムを暗黙のうちに含むフィルタにマッチする単一のItemオブジェクトを見つけるオーバーロードされたメソッド。これらのオーバーロードは、Item子型に基づいてフィルタ処理を行えるものを含む(例えば、「FindOneTargetItem」という名前のメソッド)。
・ コレクションがソースロール内に出現するアイテムを暗黙のうちに含むフィルタにマッチするネストされた要素型のオブジェクトを見つけるオーバーロードされたメソッド(例えば、「FindAllRelationships」という名前のメソッド)。
・ コレクションがソースロール内に出現するアイテムを暗黙のうちに含むフィルタにマッチするネストされた要素型のオブジェクトを見つけるオーバーロードされたメソッド(例えば、「FindAlIRelationshipsForTarget」という名前のメソッド)。
・ コレクションがソースロール内に出現するアイテムを暗黙のうちに含むフィルタにマッチするネストされた要素型の単一オブジェクトを見つけるオーバーロードされたメソッド(例えば、「FindOneRelationship」という名前のメソッド)。
・ コレクションがソースロール内に出現するアイテムを暗黙のうちに含むフィルタにマッチするネストされた要素型の単一オブジェクトを見つけるオーバーロードされたメソッド(例えば、「FindOneRelationshipForTarget」という名前のメソッド)。
クラスは、さらに、作成されたそれぞれのItem Extensionについてもこのようにして生成される。
・ Item:Item、Folder、WellKnownFolder、LocalMachineDataFolder、UserDataFolder、Principal、Service、GroupService、PersonService、PresenceService、ContactService、ADService、Person、User、Group、Organization、HouseHold
・ Elements:NestedElementBase、NestedElement、IdentityKey、SecurityID、EAddress、ContactEAddress、TelephoneNumber、SMTPEAddress、InstantMessagingAddress、Template、Profile、FullName、FamilyEvent、BasicPresence、Windows(登録商標)Presence、Relationship、TemplateRelationship、LocationRelationship、FamilyEventLocationRelationship、HouseHoldLocationRelationship、RoleOccupancy、EmployeeData、GroupMemberShip、OrganizationLocationRelationship、HouseHoldMemberData、FamilyData、SpouseData、ChildData
基本ストレージプラットフォームAPIプログラミングモデルはオブジェクト永続性である。アプリケーションプログラム(または「アプリケーション」)は、ストア上で検索を実行し、ストア内のデータを表すオブジェクトを取り出す。アプリケーションは、取り出されたオブジェクトを修正するか、または新しいオブジェクトを作成し、その後、その変更をストア内に伝搬させる。このプロセスは、ItemContextオブジェクトにより管理される。検索は、ItemSearcherオブジェクトを使用して実行され、検索結果は、FindResultオブジェクトを介してアクセス可能である。
ストレージプラットフォームAPIの発明の他の態様によれば、ランタイムフレームワークは、データクラスのオペレーションをサポートする多数のクラスを実装する。これらのフレームワーククラスは、データクラスに対するビヘイビアの共通の集合を定義し、データクラスとあわせて、ストレージプラットフォームAPIの基本プログラミングモデルを実現する。ランタイムフレームワーク内のクラスは、System.Storage名前空間に属す。この実施形態では、フレームワーククラスは、主要クラスとしてItemContext、ItemSearcher、およびFindResultを含む。他の小さなクラス、enum値、およびデリゲートも提供することができる。
ItemContextオブジェクトは、(i)アプリケーションプログラムで検索したいアイテムドメインの集合を表し、(ii)ストレージプラットフォームから取り出されたデータの状態を表すそれぞれのオブジェクトの状態情報を保持し、(iii)ストレージプラットフォームとやり取りするときに使用されるトランザクションおよびストレージプラットフォームと相互運用可能なファイルシステムを管理する。
1.ストアから読み込まれたデータを複数のオブジェクト内に逆シリアライズする。
2.オブジェクトIDを保持する(アイテムが与えられた場合にそのアイテムがクエリの結果に何回含まれていようと同じオブジェクトを使用してそのアイテムを表す)。
3.オブジェクト状態を追跡する。
1.変更を永続するために必要なストレージプラットフォーム更新グラムオペレーションを生成し、実行する。
2.必要に応じて複数のデータストアへの接続を作成し、参照関係の継ぎ目のないナビゲーションを可能にし、複数ドメイン検索から取り出されたオブジェクトを修正し、保存するようにできる。
3.ファイルで裏付けされたアイテムは、そのアイテムを表す(複数の)オブジェクトへの変更が保存されるときに適切に更新されることを保証する。
4.複数のストレージプラットフォーム接続にまたがるトランザクション、およびファイルで裏付けされたアイテム内に格納されているデータおよびファイルストリームプロパティを更新するときには、トランザクションが行われるファイルシステムを管理する。
5.ストレージプラットフォームの関係の意味、ファイルで裏付けされたアイテム、およびストリーム型付けプロパティを考慮するアイテム作成、コピー、移動、および削除オペレーションを実行する。
ItemSearcherクラスは、単純な検索をサポートし、Itemオブジェクト全体、Itemオブジェクトのストリーム、またはItemから射影された値のストリームを返す。ItemSearcherは、これらすべてに共通のコア機能、つまりターゲット型およびそのターゲット型に適用されるパラメータ化されたフィルタの概念をカプセル化したものである。また、ItemSearcherを使用することにより、同じ検索が複数の型で実行される場合にサーチャーを、最適化として、プリコンパイルする、つまり準備しておくことができる。付録Bには、一実施形態による、ItemSearcherクラスおよび複数の密接に関係するクラスのソースコードリスティングを掲載する。
検索ターゲット型は、ItemSearcherを構築するときに設定される。ターゲット型は、データストアによりクエリ可能なエクステントにマッピングされる。特に、これは、スキーマ化されたビューとともにアイテム、関係、およびアイテム拡張型にマッピングされるCLR型である。
ItemSearcherは、検索で使用されるフィルタを定義するフィルタを指定するプロパティ(例えば、SearchExpressionオブジェクトのコレクションとして「Filters」という名前が付けられているプロパティ)を含む。このコレクション内のすべてのフィルタは、検索が実行されるときに、論理および演算子を使用して結合される。フィルタは、パラメータ参照を含むことができる。パラメータ値は、Parametersプロパティを通じて指定される。
同じ検索が、場合によってはパラメータ変更のみで、繰り返し実行される状況では、検索をプリコンパイルする、つまり準備しておくことにより、パフォーマンスをある程度改善することが可能である。これは、ItemSearcher上のprepareメソッドの集合で実行される(例えば、たぶん「PrepareFind」という名前の1つまたは複数のItemを返すFindを準備するメソッド、およびたぶん「PrepareProject」という名前の射影を返すFindを準備するメソッド)。例えば、次のようである。
単純検索に適用することができるオプションは多数ある。これらは、例えば、FindOptionsオブジェクトで指定し、Findメソッドに渡すことができる。例えば、次のようである。
1.検索ターゲット型のスカラープロパティ、
2.単一値プロパティをトラバースすることにより検索ターゲット型から到達可能なネストされた要素内のスカラープロパティ、または
3.有効な引数を持つ集計関数の結果(例えば、多値プロパティまたは関係をトラバースすることにより検索ターゲット型から到達可能なネストされた要素内のスカラープロパティに適用されるMax)。
1.「Birthdate」−有効、birthdateはPerson型のスカラープロパティである。
2.「PersonalNames.Surname」−無効、PersonalNamesは多値プロパティであり、集計関数は使用されていない。
3.「Count(PersonalNames)」−有効、PersonalNamesのカウント。
4.「Case(Contact.MemberOfHousehold).Household.HouseholdEAddresses.StartDate」−無効、集計関数なしで関係および多値プロパティを使用する。
5.「Max(Cast(Contact.MemberOfHousehold).Household.HouseholdEAddresses.StartDate)」−有効、一番最近の家庭の電子メールアドレス開始日。
ItemSearcherは(例えば、FindAllメソッドを通じて)、検索(例えば、「FindResult」オブジェクト)により返されるオブジェクトにアクセスするために使用することができるオブジェクトを返す。付録Cには、一実施形態による、FindResultクラスおよび複数の密接に関係するクラスのソースコードリスティングを掲載する。
図22は、動作中のランタイムフレームワークを例示している。ランタイムフレームワークは以下のように動作する。
1.アプリケーション350a、350b、または350cは、ストレージプラットフォーム内のアイテムにバインドする。
2.フレームワーク2004は、バインドされたアイテムに対応するItemContextオブジェクト2202を作成し、アプリケーションに返す。
3.アプリケーションは、このItemContext上でFindをサブミットして、Itemのコレクションを取得し、返されるコレクションは、概念上オブジェクトグラフ2204となる(関係により)。
4.アプリケーションは、データを変更、削除、および挿入する。
5.アプリケーションは、Update()メソッドを呼び出して変更を保存する。
この節では、ストレージプラットフォームAPIフレームワーククラスを使用してデータストア内のアイテムを操作する方法の様々な実施例を取りあげる。
アプリケーションは、例えば、静的なItemContext.Openを呼び出し、ItemContextに関連付けられるアイテムドメインを識別する1つまたは複数のパスを供給することにより、データストアを対話操作するために使用するItemContextオブジェクトを取得する。アイテムドメインは、ItemContextを使用して実行される検索をスコープに設定し、そのドメインアイテムおよびそのアイテムに含まれるアイテムのみが検索対象になるようにする。実施例は、以下の通りである。
ItemContextを明示的に閉じる
本発明の他の態様によれば、ストレージプラットフォームAPIは、アプリケーションプログラマが基礎のデータベースエンジンのクエリ言語の詳細を気にせずに、データストア内のアイテムの様々なプロパティに基づいて、クエリを形成するために使用できるようにする簡略化されたクエリモデルを備える。
与えられた型のすべてのアイテムを検索する
検索を実行する際に、並べ替え、遅延ロード、および結果の数の制限を含む、様々なオプションを指定することができる。
検索結果を並べ替える
ときには第1の結果のみを取り出すことが有用な場合があり、特に並べ替え条件を指定する場合である。さらに、ある種の検索は、ただ1つのオブジェクト返すことが予期され、オブジェクトをまったく返さないことは予期されない。
1つのオブジェクトを検索する
単純検索の実行をできる限り簡単にするItemContext上のショートカットメソッドも多数ある。
ItemContext.FindAllショートカットを使用して検索する
さらに、アイテム、関係、およびアイテム拡張は、その(複数の)idを与えることにより取り出すことができる。アイテムは、さらに、パスによっても取り出せる。
(複数の)idを与えてアイテム、関係、およびアイテム拡張を取得する
他のオブジェクトのコンテクストで、または特定のパラメータとともに、検索を実行するヘルパメソッドを用意することが望ましい場所がストレージプラットフォームAPI内に多数ある。GetSearcherパターンを使用することで、これらのシナリオが可能になる。APIには多数のGetSearcherメソッドが用意されている。それぞれ、与えられた検索を実行するように事前に構成されたItemSearcherを返す。例えば、次のようである。
オブジェクトは、検索により取り出された後、必要に応じてアプリケーションにより修正することができる。新しいオブジェクトも作成し、既存のオブジェクトに関連付けることもできる。アプリケーションは、論理グループを形成するすべての変更を加えた後に、ItemContext.Updateを呼び出して、ストアへの変更を永続的にする。本発明のストレージプラットフォームAPIのさらに他の態様によれば、このAPIは、アプリケーションプログラムによりアイテムに加えられた変更を集めてから、それらをデータストアが実装されているデータベースエンジン(または何らかの種類のストレージエンジン)により要求される正しい更新に編成する。これにより、アプリケーションプログラマは、データストア更新の複雑な部分をAPIに任せつつ、メモリ中のアイテムに変更を加えることができる。
単一アイテムへの変更を保存する
上の節II.E(セキュリティ)を参照すると、ストレージプラットフォームAPIのこの実施形態では、ストア内のアイテムに関連付けられているセキュリティポリシーの取り出しおよび修正を行うためにItem Context上で使用可能なメソッドが5つある。これらは以下の通りである。
1.GetItemSecurity、
2.SetItemSecurity、
3.GetPathSecurity、
4.SetPathSecurity、
5.GetEffectiveItemSecurity。
上述のように、ストレージプラットフォームのデータモデルは、アイテムを互いに関係付けられる「関係」を定義する。スキーマのデータクラスが生成されるときに、関係の型毎に以下のクラスが生成される。
1.関係自体を表すクラス。このクラスは、Relationshipクラスから派生され、その関係型に特有のメンバを含む。
2.強く型付けされた「仮想」コレクションクラス。このクラスは、VirtualRelationshipCollectionから派生され、これにより、関係インスタンスの作成および削除を実行することができる。
ストレージプラットフォームAPIは、関係APIの基礎を形成するSystem.Storage名前空間内に多数の型を提供する。これらは以下の通りである。
1.Relationship−すべての関係クラスの基本型
2.VirtualRelationshipCollection−すべての関係コレクションの基本型
3.ItemReference、ItemIdReference、ItemPathReference−アイテム参照型を表し、それらの型の間の関係は図11に例示されている。
以下は、関係クラスの基本クラスである。
public abstract class Relationship : StoreObject
{
//既定値で作成する。
protected Relationship (ItemIDReference targetItemReference);
//関係コレクションに追加されたことを関係に通知する。オブジェクトは、コレクションに問い合わせを行い、ソースアイテム、アイテムコンテクストなどを決定する。
internal AddedToCollection (VirtualRelationshipCollection collection);
//関係のid。
public RelationshipId RelationshipId {get;}
//ソースアイテムのid。
public ItemId SourceItemId {get;}
//ソースアイテムを取得する。
public Item SourceItem {get;}
//ターゲットアイテムへの参照。
public ItemIdReference TargetItemReference {get;}
//ターゲットアイテムを取得する(TargetItemReference.GetItem()を呼び出す)。
public Item TargetItem {get;}
//ItemContextがすでにターゲットアイテムのドメインとの接続を持っているか判定する(TargetItemReference.IsDomainConnectedを呼び出す)。
public bool IsTargetDomainConnected {get;}
//名前空間内のターゲットアイテムの名前。名前は、すべてのソースアイテムの保持関係にわたって一意的でなければならない。
public OptionalValue<string> Name {get; set;}
//これは保持関係または参照関係かを決定する。
public OptionalValue<bool> IsOwned {get; set;}
以下は、アイテム参照型の基本クラスである。
public abstract class ItemReference : NestedElement
{
//既定値で作成する。
protected ItemReference();
//参照されているアイテムを返す。
public virtual Item GetItem ();
//参照されたアイテムのドメインへの接続が確立されたかどうかを判定する。
public virtual bool IsDomainConnected ();
}
以下は、ItemIdRefrenceクラス−ターゲットアイテムを識別するためにアイテムidを使用するItem参照−である。
public class ItemIdReference : ItemReference
{
//既定値で新しいItemIdReferenceを構築する。
public ItemIdReference ();
//指定されたアイテムへの新しいItemIdReferenceを構築する。Itemに関連付けられているドメインは、ロケータとして使用される。
public ItemIdReference (Item item);
//NULLロケータと与えられたターゲットアイテムidを使用して新しいItemIdReferenceを構築する。
public ItemIdReference (Itemld itemId);
//与えられたロケータとアイテムid値を使用して新しいItemIdReferenceを構築する。
public ItemIdReference (string locator, ItemId itemId);
//ターゲットアイテムのid。
public ItemId ItemId {get; set;}
//ドメイン内にターゲットアイテムを含むそのWinFSアイテムを識別するパス。NULLの場合、そのアイテムを含むドメインは知られていない。
public OptionalValue<string> Locator {get; set;}
//参照されたアイテムのドメインへの接続が確立されたかどうかを判定する。
public override bool IsDomainConnected();
//参照されているアイテムを取り出す。
public override Item Getitem ();
}
ItemPathReferenceクラスは、パスを使用してターゲットアイテムを識別するアイテム参照である。このクラスに対するコードは以下の通りである。
public class ItemPathReference : ItemReference
{
//既定値でアイテムパス参照を構築する。
public ItemPathReference ();
//ロケータなしで、与えられたパスを付けて、アイテムパス参照を構築する。
public ItemPathReference (string path);
//与えられたロケータおよびパスを付けて、アイテムパス参照を構築する。
public ItemPathReference (string locator, string path);
//ドメイン内にターゲットアイテムを含むそのWinFSアイテムを識別するパス。
public OptionalValue<string> Locator {get; set;}
//ロケータにより指定されたアイテムドメインに関するターゲットアイテムのパス。
public string Path {get; set;}
//参照されたアイテムのドメインへの接続が確立されたかどうかを判定する。
public override bool IsDomainConnected();
//参照されているアイテムを取り出す。
public override Item GetItem();
}
RelationshipId構造体は、関係id GUIDをカプセル化する。
public class RelationshipId
{
//新しい関係id GUIDを生成する。
public static RelationshipId NewRelationshipId ();
//新しい関係id GUIDで初期化する。
public RelationshipId();
//指定されたGUIDで初期化する。
public RelationshipId (Guid id);
//GUIDの文字列表現で初期化する。
public RelationshipId (string id);
//関係id GUIDの文字列表現を返す。
public override string ToString ();
//System.GuidインスタンスをRelationshipIdインスタンスに変換する。
public static implicit operator RelationshipId (Guid guid);
//RelationshipIdインスタンスをSystem.Guidインスタンスに変換する。
public static implicit operator Guid (RelationshipId relationshipId);
}
VirtualRelationshipCollectionクラスは、データストアからのオブジェクト、それに加えて、コレクションに追加された新しいオブジェクトを含むが、ただし、ストアから削除されたオブジェクトを含まない、関係オブジェクトのコレクションを実装する。与えられたソースアイテムidを持つ指定された関係型のオブジェクトは、コレクションに含まれる。
public abstract class VirtualRelationshipCollection : ICollection
{
//コレクションは、itemIdにより識別されたアイテムにより所有される指定された型の関係を含む。
protected VirtualRelationshipCollection (ItemContext itemContext, ItemId itemId, Type relationshipType);
//列挙子は、状態Insertedを持つオブジェクトに加えて状態Deletedを持つオブジェクトを除くストアからに取り出されたすべてのオブジェクトを返す。
public IEnumerator GetEnumerator ();
//列挙子により返されるであろう関係オブジェクトの数のカウントを返す。このカウントは、ストアからすべてのオブジェクトを取り出さなくても計算される。
public int Count {get;}
//常にfalseを返す。
public bool ICollection.lsSynchronized () {get;}
//常にこのオブジェクトを返す。
public object ICollection.SyncRoot {get;}
//ストア内で必要なオブジェクトを検索する。
public void Refresh ();
//指定された関係をコレクションに追加する。オブジェクトは、状態ConstructedまたはRemovedを持たなければならない。状態がConstructedであれば、状態はAddedに変更される。状態がRemovedであれば、状態は適宜RetrievedまたはModifiedに変更される。この関係のソースアイテムidは、コレクションが構築されたときに与えられたソースアイテムidと同じでなければならない。
protected void Add (Relationship relationship);
//指定された関係をコレクションから削除する。オブジェクトの状態は、Added、Retrieved、またはModifiedでなければならない。オブジェクトの状態がAddedの場合、これは、Constructedに設定される。オブジェクトの状態がRetrievedまたはModifiedの場合、これはRemovedに設定される。この関係のソースアイテムidは、コレクションが構築されたときに与えられたソースアイテムidと同じでなければならない。
protected void Remove (Relationship relationship);
//コレクションから削除されたオブジェクト。
public ICollection RemovedRelationships {get;}
//コレクションに追加されたオブジェクト。
public ICollection AddedRelationships {get;}
//ストアから取り出されたオブジェクト。このコレクションは、VirtualRelationshipCollectionが列挙されるか、Refreshが呼び出されるまで空である(このプロパティの値を取得してもコレクションは書き込まれない)。
public ICollection StoredRelationships {get;}
//非同期メソッド。
public IAsyncResult BeginGetCount(IAsyncCallback callback, object state);
public int EndGetCount(IAsyncResult asyncResult);
public IAsyncResult BeginRefresh(IAsyncCallback callback, object state);
public void EndRefresh(IAsyncResult asyncResult);
}
ストレージプラットフォームスキーマのクラスを生成する場合、関係宣言毎に1つのクラスが生成される。関係自体を表すクラスに加えて、関係コレクションクラスも、それぞれの関係について生成される。これらのクラスは、関係のソースまたはターゲットアイテムクラス内のプロパティの型として使用される。
この節では、それぞれの関係型について生成されるクラスを説明する。例えば、次のようである。
これは、「HoldingRelationshipPrototype」という名前の保持関係に対するプロトタイプ関係クラスであり、ソース終点は「Head」という名前を持ち、「Foo」アイテム型を指定し、ターゲット終点は「Tail」という名前を持ち、「Bar」アイテム型を指定する。これは以下のように定義される。
これは、指定されたアイテムにより所有されるRelationshipPrototype関係インスタンスのコレクションを保持する、RelationshipPrototypeクラスで生成された、プロトタイプクラスである。これは以下のように定義される。
Itemクラスは、そのアイテムが関係のソースである関係にアクセスできるようにするRelationshipsプロパティを含む。Relationshipsプロパティは、型RelationshipCollectionを持つ。
以下のコードは、Itemクラスの関係コンテクストプロパティを示している。
このクラスを使用すると、与えられたアイテムが関係のソースである関係インスタンスにアクセスできる。これは以下のように定義される。
検索式の中で、関係と関係づけられているアイテムとの間の結合のトラバースを指定することが可能である。
検索式の現在のコンテクストがアイテムの集合である場合、アイテムがソースであるアイテムと関係インスタンスとの間の結合は、Item.Relationshipsプロパティを使用して実行できる。特定の型の関係への結合は、検索式Cast演算子を使用して指定することができる。
検索式の現在のコンテクストが関係の集合である場合、関係から関係のいずれかの終点への結合は、終点の名前を指定することによりトラバースすることができる。関係アイテムの集合が確立された後、それらのアイテムのプロパティは、述語の中で使用するか、または射影のターゲットとして使用することができる。射影のターゲットを指定するために使用される場合、アイテムの集合が返される。例えば、以下のステートメントは、従業員のラストネームが「Smith」であるすべてのEmployeeOfOrganization関係(組織に関係なく)を見つける。
アイテムから関係へ、関係からアイテムへトラバースする前の2つのパターンを組み合わせて、いくらでも複雑なトラバースを得ることができる。例えば、姓が「Smith」である従業員が含まれるすべての組織を見つけるには、以下のようにする。
以下は、関係を操作するためのストレージプラットフォームAPI内の関係サポートの使用例を示す。以下の実施例では、以下の宣言を仮定する。
ソースまたはターゲット関係を検索することが可能である。フィルタを使用することにより、指定された型を持ちプロパティ値を与えた関係を選択することができる。また、フィルタを使用することにより、関係ベースの関係するアイテム型またはプロパティ値を選択することができる。例えば、以下の検索を実行できる。
与えられたアイテムがソースであるすべての関係
検索を通じて関係オブジェクトが取り出された後、ターゲットまたはソースアイテムに「ナビゲート」することが可能である。基本関係クラスは、Itemオブジェクトを返すSourceItemおよびTargetItemプロパティを備える。生成された関係クラスは、等価な強く型付けられた、名前付きプロパティ(例えば、FolderMember.FolderItemおよびFolderMember.MemberItem)を備える。例えば、次のようである。
名前「Foo」を持つ関係に対するソースおよびターゲットアイテムにナビゲートする
未接続ドメイン内のターゲットアイテムをチェックする
アイテムオブジェクトが与えられると、明示的検索を実行せずに、そのアイテムがソースである関係にナビゲートすることが可能である。これは、Folder.MemberRelationshipsなどのItem.Relationshipsコレクションプロパティまたは強く型付けされたコレクションプロパティを使用して実行される。関係から、ターゲットアイテムにナビゲートすることが可能である。このようなナビゲーションは、ターゲットアイテムがターゲットアイテムと同じストア内にない場合を含む、ターゲットアイテムがソースアイテムのItemContextに関連付けられたアイテムドメイン内にない場合でも、機能する。例えば、次のようである。
ソースアイテムからターゲットアイテムへの関係にナビゲートする
関係コレクションのサイズをチェックする
新しい関係は、関係オブジェクトを作成し、それをソースアイテム内の関係に追加し、ItemContextを更新することにより作成される。新しいアイテムを作成するには、保持または埋め込み関係を作成しなければならない。例えば、次のようである。
新しいアイテムを既存のフォルダに追加する
保持関係を削除する
上述のように、すべてのストレージプラットフォームスキーマの結果、クラスの集合が得られる。これらのクラスは、Find*などの標準的なメソッドを備え、さらに、フィールド値を取得および設定するプロパティも用意する。これらのクラスおよび関連付けられたメソッドは、ストレージプラットフォームAPIの基礎を形成する。
これらの標準的メソッドに加えて、すべてのスキーマは、それに対するドメイン特有のメソッドの集合を持つ。これらをドメインビヘイビアと呼ぶ。例えば、Contactsスキーマ内のドメインビヘイビアの一例として以下のようなものがある。
・ 電子メールアドレスは有効か?
・ フォルダが与えられた場合、そのフォルダのすべてのメンバのコレクションを取得する。
・ アイテムIDが与えられた場合、このアイテムを表すオブジェクトを取得する。
・ Personが与えられた場合、そのオンラインステータスを取得する。
・ 新しい連絡先または一時的連絡先を作成するヘルパ機能。
・ その他。
ドメインビヘイビアを持つデータクラスは、アプリケーション開発者が足場とする基礎を形成する。しかし、データクラスがそのデータに関係する考えられるすべてのビヘイビアを公開することは可能でも、望ましいことでもない。ストレージプラットフォームでは、開発者はストレージプラットフォームAPIにより提供される基本機能を足場とすることができる。ここで基本パターンは、メソッドがストレージプラットフォームデータクラスのうちの1つまたは複数をパラメータとしてとるクラスを作成することである。例えば、Microsoft Outlook使用するか、またはMicrosoft Windows(登録商標)メッセンジャを使用して電子メールを送信するための付加価値クラスは以下の通りとすることができる。
本発明の実施形態では、ストレージプラットフォームAPIは、与えられた型について付加価値クラスを「サービス」として登録できるメカニズムを備える。これにより、アプリケーションは、与えられた型のサービスプロバイダ(=付加価値クラス)を設定、取得することができる。このメカニズムの使用を望む付加価値クラスは、よく知られているインターフェースを実装すべきであり、例えば、以下の通りである。
この節では、本発明の実施形態により、ストレージプラットフォームのSchemaがクライアント上のストレージプラットフォームAPIクラスおよびサーバ上のUDTクラスにどのように変わるかを説明する。図24の図は、関わっているコンポーネントを示している。
基本に帰着させた場合、アプリケーションのパターンは、ストレージプラットフォームAPIを使用した場合、ItemContextを開く、フィルタ条件付きでFindを使用し、所望のオブジェクトを取り出す、オブジェクトに演算を実行する、および変更をストアに送り返す、というものである。この節は、フィルタ文字列に入るものの構文に関する。
フィルタ文字列は、空であり、指定された型のすべてのオブジェクトが返されることを示すか、またはそれぞれの返されるオブジェクトが満たさなければならない論理式である。この式は、オブジェクトプロパティを参照する。ストレージプラットフォームAPIランタイムは、どのようにこれらのプロパティ名がストレージプラットフォームの型フィールド名にマッピングされ、最終的に、ストレージプラットフォームストアにより保持されるSQLビューにマッピングされるかについて関知している。
プロパティに格納されている値の型がプロパティ宣言型から派生されることはよくあることである。例えば、Person内のPersonalEAddressesプロパティは、EMailAddressおよびTelephoneNumberなどのEAddressから派生された型のコレクションを含む。電話市外局番に基づいてフィルタ処理するには、EAddress型からTelephoneNumber型に型変換する必要がある。
以下では、一実施形態による、ストレージプラットフォームAPIによりサポートされているフィルタ構文を説明する。
a)APIにおけるローカル/リモート透過性
ストレージプラットフォームのデータアクセスは、ローカルストレージプラットフォームインスタンスをターゲットとしている。ローカルインスタンスは、クエリ(またはその一部)がリモートデータを参照している場合にルータとして使用される。そのため、APIレイヤは、ローカル/リモート透過性を備え、ローカルデータアクセスとリモートデータアクセスとの間でAPIの構造的な違いはない。これは、純粋に、要求されたスコープの機能である。
ストレージプラットフォームのデータストアは、HTTP上で実行される特別なOLEDBプロバイダを使用して互いに対話する(既定のOLEDBプロバイダはTDSを使用する)。一実施形態では、分散クエリは、リレーショナルデータベースエンジンの既定のOPENROWSET機能を適用される。特別なユーザ定義関数(UDF)、DoRemoteQuery(server,queryText)が用意され、実際のリモーティングを実行する。
本発明のストレージプラットフォームの一実施形態では、ストアがストレージプラットフォームのデータアクセスに加わることを許す汎用プロバイダアーキテクチャはない。しかし、Microsoft ExchangeおよびMicrosoft Active Directory(AD)の特定の場合に対する制限されたプロバイダアーキテクチャが提供される。これは、開発者が、ちょうどストレージプラットフォーム内にはあるように、ストレージプラットフォームAPIを使用し、ADおよびExchange内のデータにアクセスできることを意味するが、アクセスできるデータは、ストレージプラットフォームのスキーマ化された型に制限されることを意味する。したがって、アドレス帳(=ストレージプラットフォームのPerson型のコレクション)は、ADでサポートされ、メール、カレンダー、および連絡先は、Exchange用にサポートされる。
ストレージプラットフォームのプロパティプロモータ(property promoter)は、過去のマウントポイントを格上げしない。名前空間がマウントポイントを通じてアクセスするのに十分リッチであるとしても、クエリはそれらを通過しない。ストレージプラットフォームボリュームは、DFSツリー内の葉ノードとして現れることができる。
開発者は、ストレージプラットフォームAPIを使用して、データストアの上に「GXA head」を公開することができる。概念的には、これは、他のWebサービスを作成するのと異ならない。ストレージプラットフォームAPIは、GXAを使用してストレージプラットフォームデータストアと対話しない。上述のように、APIは、TDSを使用してローカルストアと対話し、どのリモーティングも、同期サービスを使用してローカルストアにより処理される。
ストレージプラットフォームデータモデルでは、型に対する値制約条件を持つことができる。それらの制約条件は、ストア上で自動的に評価され、このプロセスは、ユーザにとって透過的である。制約条件は、サーバ側でチェックされることに注意されたい。このことに注意すると、ときには、サーバへの往復やり取りのオーバーヘッドを被ることなく、入力データが制約条件を満たすことを確認できる融通性を開発者に対し与えることが望ましい。これは、本質的に、エンドユーザがオブジェクトに埋めるために使用されるデータを入力する対話的アプリケーションで有用である。ストレージプラットフォームAPIはこの機能を実現している。
ストレージプラットフォームの共有は、
共有アイテム型は、共有名、および共有ターゲット(これは、非保持リンクであってよい)のプロパティを持つ。例えば、上述の共有の名前は、WorkContactsであり、ターゲットは、ボリュームJohns_Information上のContacts_Categories\Workである。以下に、Share型のスキーマ断片を示す。
共有はアイテムであるため、共有は他のアイテムとまったく同様に管理できる。共有は、作成、削除、および修正が可能である。共有は、さらに、他のストレージプラットフォームアイテムと同じようにしてセキュリティ設定される。
アプリケーションは、ItemContext.Open()メソッド呼び出しで共有名(例えば、\\Johns_Desktop\WorkContacts)をストレージプラットフォームAPIに渡すことによりリモートストレージプラットフォーム共有にアクセスする。ItemContext.Openは、ItemContextオブジェクトインスタンスを返す。その後、ストレージプラットフォームAPIは、ローカルストレージプラットフォームサービスと対話する(リモートストレージプラットフォーム共有へのアクセスは、ローカルストレージプラットフォームを介して行われることに注意されたい)。次に、ローカルストレージプラットフォームサービスは、与えられた共有名(例えば、WorkContacts)を使用してリモートストレージプラットフォームサービス(例えば、マシンJohns_Desktop上の)と対話する。その後、リモートストレージプラットフォームサービスは、WorkContactsをContacts_Categories\Workに翻訳して、それを開く。その後、クエリおよびその他のオペレーションが他のスコープとまったく同様に実行される。
一実施形態では、アプリケーションプログラムは、以下のようにして、与えられた<DNS Name>上で使用可能な共有を発見することができる。第1の方法により、ストレージプラットフォームAPIはDNS名(例えば、Johns_Desktop)をItemContext.Open()メソッドのスコープパラメータとして受け付ける。ストレージプラットフォームAPIは、次に、このDNS名を接続文字列の一部として使用しストレージプラットフォームストアに接続する。この接続では、アプリケーションが唯一できることは、ItemContext.FindAll(typeof(Share))を呼び出すことである。その後、ストレージプラットフォームサービスは、接続されているすべてのボリューム上のすべての共有を合併し、共有のコレクションを返す。第2の方法により、ローカルマシン上で、管理者はFindAll(typeof(Share))により特定のボリューム上の、またはFindAll(typeof(Share),“Target(ShareDestination).Id=folderId”)により特定のフォルダ上の共有を容易に発見することができる。
Find*メソッド(ItemContextオブジェクトで呼び出されようと、個々のアイテム上で呼び出されようと関係なく)は、一般に、与えられたコンテクスト内のItem(埋め込まれたアイテムを含む)に適用される。ネストされた要素は、Findを持たない−包含Itemと無関係に検索することはできない。これは、ネストされた要素が包含アイテムからその「アイデンティティ」を派生させる、ストレージプラットフォームデータモデルで望ましい意味と一致する。この概念をより明確にするために、以下に、有効なfindオペレーションと無効なfindオペレーションの実施例を示す。
a)市外局番206を持つシステム内のすべての電話番号を表示する?
無効、findはアイテムを参照せずに電話番号−要素−に対し実行されるため。
b)市外局番206を持つすべてのPersons内のすべての電話番号を表示する?
無効、Person(=アイテム)が参照されるとしても、検索条件はそのアイテムを含まない。
c)市外局番206を持つすべてのMurali(=1人)のすべての電話番号を表示する?
有効、Itemに対し検索条件があるため(「Murali」という名前のPerson)。
この節では、ストレージプラットフォームContacts APIの概要を述べる。Contacts APIの背後にあるスキーマは、図21Aおよび21Bに示されている。
ストレージプラットフォームAPIは、Contactsスキーマ内のアイテムおよび要素を取り扱うための名前空間を含む。この名前空間は、System.Storage.Contactと呼ばれる。
・ Item:UserDataFolder、User、Person、ADService、Service、Group、Organization、Principal、Location
・ Elements:Profile、PostalAddress、EmailAddress、TelephoneNumber、RealTimeAddress、EAddress、FullName、BasicPresence、GroupMembership、RoleOccupancy
以下に、Contactsスキーマのドメインビヘイビアのリストを示す。十分に高いレベルから見た場合、ドメインビヘイビアは、以下の適切に認識可能なカテゴリに分類される。
・ 静的ヘルパ、例えば、新しい個人連絡先を作成するためのPerson.CreatePersonalContact()、
・ インスタンスヘルパ、例えば、ユーザ(Userクラスのインスタンス)を自動ログインのマークが付けられているすべてのプロファイルにログインさせるuser.AutoLoginToAllProfiles()、
・ カテゴリGUIDs、例えば、Category.Home、Category.Workなど、
・ 派生プロパティ、例えば、emailAddress.Address()−与えられたemailAddress(=EmailAddressクラスのインスタンス)のユーザ名およびドメインフィールドを組み合わせた文字列を返す、派生コレクション、例えば、person.PersonalEmailAddresses−Personクラスのインスタンスが与えられた場合、その個人電子メールアドレスを取得する。
この節では、本発明の一態様による、ストレージプラットフォームFile APIの概要を説明する。
(1)ストレージプラットフォーム内でのNTFSボリュームの反映
ストレージプラットフォームは、既存のNTFSボリューム内の内容の上にインデックス作成を行う手段を備える。これは、NTFS内のそれぞれのファイルストリームまたはディレクトリからプロパティを抽出(「格上げ」)し、それらのプロパティをストレージプラットフォーム内にItemとして格納することにより実行される。
NTFSボリュームがストレージプラットフォームボリュームに格上げされると、その中のすべてのファイルおよびディレクトリは、そのボリュームの特定の一部となる。この領域は、ストレージプラットフォームの観点から読み取り専用であり、FSPMは新しいディレクトリおよびファイルを作成し、および/または既存のアイテムのプロパティを変更することができる。
1.名前空間内のどこでもストレージプラットフォームアイテム型を作成できる(もちろん、パーミッションにより禁止されていない限り)。
2.ストレージプラットフォームアイテム型は、ストレージプラットフォームAPIを使用して読み込むことができる。
3.すべてのストレージプラットフォームアイテム型は、FileおよびDirectoryを除いて、ストレージプラットフォームAPIを使用して書き込むことが可能である。
4.名前空間内のどこにあるかに関係なくFileおよびDirectoryアイテムに書き込みを行うために、Win32 APIを使用する。
5.「格上げされた」名前空間内のFile/Directoryへの変更は、ストレージプラットフォーム内に即座に現れないことがあるが、「格上げされない」名前空間内では、変更は、ストレージプラットフォーム内に即座に反映される。
図25は、File APIが基づくスキーマを例示している。
ストレージプラットフォームAPIは、ファイルオブジェクトを取り扱うための名前空間を含む。この名前空間は、System.Storage.Filesと呼ばれる。System.Storage.Filesのクラスのデータメンバは、ストレージプラットフォームストアに格納されている情報を直接反映し、この情報は、ファイルシステムオブジェクトから「格上げ」されるか、またはWin32 APIを使用してネイティブな形で作成することができる。System.Storage.Files名前空間は、FileItemおよびDirectoryItemの2つのクラスを持つ。これらのクラスおよびそのメソッドのメンバは、図25のスキーマ図を見ると容易に推測できる。FileItemおよびDirectoryItemは、ストレージプラットフォームAPIからは読み取り専用である。それらを修正するためには、Win32 APIを使用するか、またはSystem.IOのクラスを使用する必要がある。
この節では、System.Storage.Files内でのクラスの使用を例示する3つのコード例を取りあげる。
この実施例は、「従来」のファイル操作の仕方を示している。
ストレージプラットフォームストアは、ファイルシステムから格上げされたプロパティを保持するので、ファイルに対しリッチなクエリを容易に実行することが可能である。この実施例では、過去3日以内に修正されたすべてのファイルの一覧が表示される。
一実施形態では、ファイルクラスは、標準のプロパティおよびメソッドに加えて、さらに、ドメインビヘイビア(手書きコーディングのプロパティおよびメソッド)を持つ。これらのビヘイビアは、一般に、対応するSystem.IOクラス内のメソッドに基づく。
これまでに例示したように、本発明は、データの編成、検索、および共有のためのストレージプラットフォームを対象とする。本発明のストレージプラットフォームは、既存のファイルシステムおよびデータベースシステムを超えてデータストレージの概念を拡張し、広げるものであり、リレーショナル(表形式)データ、XML、およびItemと呼ばれる新しいデータ形態などの、構造化、非構造化、または半構造化データを含むすべての型のデータ用のストアとなるように設計されている。本発明のストレージプラットフォームでは、共通のストレージ基盤および図式化されたデータを通じて、より効率的なアプリケーション開発を消費者、知識労働者、および企業向けに行うことができる。これは、データモデルに固有の機能を利用可能にするだけでなく、既存のファイルシステムおよびデータベースアクセス方法も包含し、拡張する機能豊富な拡張可能アプリケーションプログラミングインターフェースを備える。本発明の広範な概念から逸脱することなく、上述の実施形態に対し変更を加えられることは理解される。したがって、本発明は、開示されている特定の実施形態に限定されず、付属の請求項の定義に従って本発明の趣旨および範囲内にあるすべての修正形態を対象とすることを意図されている。
//アプリケーションは、ItemContextオブジェクトを直接作成できず、またItemContextからクラスを派生させることもできない。
interal ItemContext();
//指定されたパス、またはパスが指定されていない場合には、ローカルコンピュータ上の既定のストアを検索するために使用できるItemContextを作成する。
public static ItemContext Open();
public static ItemContext Open(string path);
public static ItemContext Open(params string[] paths);
//ItemContextが作成された場合に指定されたパスを返す。
public string[] GetOpenPaths();
//このItemContextのコピーを作成する。コピーは、独立のトランザクション、キャッシュ、および更新状態を持つ。キャッシュは、最初は空になる。クローン作成されたItemContextを使用することは、同じ(複数の)アイテムドメインを使用して新しいItemContextを開くことよりも効率的であると予想される。
public ItemContext Clone();
//ItemContextを閉じる。閉じられた後にItemContextを使用しようとすると、ObjectDisposedExceptionが発生する。
public void Close();
void IDisposable.Dispose();
//ItemContextが開かれたときに指定されたドメインがリモートコンピュータに解決する場合にTrue。
public bool IsRemote {get;}
//要求されたサービス型を供給することができるオブジェクトを返す。要求されたサービスを提供できない場合にはNULLを返す。IServiceProviderパターンを使用すると、通常は使用されない、また使用すれば開発者を混乱させる可能性のあるAPIをItemContextクラスから取り除くことができる。ItemContextは、サービスIItemSerialization、IStoreObjectCacheを提供することができる。
public object GetService(Type serviceType);
関係するメンバを更新する
//修正されたすべてのオブジェクトおよびMarkForCreateまたはMarkForDeleteに渡されるすべてのオブジェクトにより表される変更を保存する。更新競合が検出された場合にはUpdateCollisionExceptionをスローすることがある。
public void Update();
//指定されたオブジェクトにより表される変更を保存する。オブジェクトは、修正されたか、またはMarkForCreateまたはMarkForDeleteに渡されていなければならないが、そうでなければArgument−Exceptionがスローされる。更新競合が検出された場合にはUpdateCollisionExceptionをスローすることがある。
public void Update(object objectToUpdate);
public void Update(IEnumerable objectsToUpdate);
//ストアからの指定されたオブジェクトの内容をリフレッシュする。オブジェクトが修正されている場合、変更は上書きされ、オブジェクトはもはや修正されたとみなされない。アイテム、アイテム拡張、または関係オブジェクト以外のものが指定されている場合、ArgumentExceptionをスローする。
public void Refresh(object objectToRefresh);
public void Refresh(IEnumerable objectsToRefresh);
//修正されたオブジェクトが取り出されたときから、それを保存しようとしたときまでの間にストア内でデータが変更されたことを更新で検出した場合に発生する。イベントハンドラが登録されていないない場合、更新は例外をスローする。イベントハンドラが登録されている場合、例外をスローし、更新を中断することができ、それにより、修正されたオブジェクトはストア内のデータを上書きするか、またはストアおよびオブジェクト内で加えられた変更をマージする。
public event ChangeCollisionEventHandler UpdateCollision;
//更新処理中の様々な時点において発生し、更新進捗情報を供給する。
public event UpdateProgressEventhandler UpdateProgress;
//Updateの非同期バージョン
public IAsyncResult BeginUpdate(IAsyncCallback callback, object state);
public IAsyncResult BeginUpdate(object objectToUpdate, IAsyncCallback callback, object state);
public IAsyncResult BeginUpdate(IEnumerable objectsToUpdate, IAsyncCallback callback, object state);
public void EndUpdate(IAsyncResult result);
//Refreshの非同期バージョン
public IAsyncResult BeginRefresh(object objectToRefresh, IAsyncCallback callback, object state);
public IAsyncResult BeginRefresh(IEnumerable objectsToRefresh, IAsyncCallback callback, object state);
public void EndRefresh(IAsyncResult result);
関係メンバのトランザクション処理
//指定された孤立レベルを持つトランザクションを開始する。既定の孤立レベルはReadCommitedである。すべての場合において、分散トランザクションが開始されるが、それは、変更ストリーム型付きアイテムプロパティを包含しなければならない場合があるからである。
public Transaction BeginTransaction();
public Transaction BeginTransaction(System.Data.IsolationLevel isolationLevel);
関係メンバを検索する
//指定された型のオブジェクトについてこのアイテムコンテクスト内で検索するItemSearcherを作成する。アイテム、関係、またはアイテム拡張以外の型が指定されている場合、ArgumentExceptionをスローする。
public ItemSearcher GetSearcher(Type type);
//idを与えられているアイテムを見つける。
public Item FindItemById(ItemId itemId);
//パスを与えられているアイテムを見つける。パスは絶対パスでも相対パスでもよい。相対パスであれば、ItemContextが開かれたときに複数のアイテムドメインが指定されている場合、NotSupportedExceptionがスローされる。そのようなアイテムが存在しない場合には、NULLを返す。アイテムを取り出すために\\machine\shareへの接続をドメインの一部として作成する。アイテムは、そのドメインに関連付けられる。
public Item FindItemByPath(string path);
//パスを与えられているアイテムを見つける。パスは、指定されたアイテムドメインに相対的である。アイテムを取り出すために指定されたドメインへの接続を作成する。アイテムは、そのドメインに関連付けられる。そのようなアイテムが存在しない場合には、NULLを返す。
public Item FindItemByPath (string domain, string path);
//パスを与えられているアイテムの集合を見つける。パスは、ItemContextが開かれたときに指定されたアイテムドメインに相対的である。そのようなアイテムが存在しない場合には、空を返す。
public FindResult FindAllItemsByPath(string path);
//idを与えられている関係を見つける。
public Relatioinship FindRelationshipById(ItemId itemID, RelationshipId relationshipId);
//idを与えられているアイテム拡張を見つける。
public ItemExtension FindItemExtensionById(ItemId itemId, ItemExtensionId itemExtensionId);
//与えられたフィルタ条件をオプションにより満たす指定された型のすべてのアイテム、関係、またはアイテム拡張を見つける。これら以外の型が指定されていれば、ArgumentExceptionをスローする。
public FindResult FindAll(Type type);
public FindResult FindAll(Type type, string filter);
//与えられたフィルタ条件を満たす指定された型の任意のアイテム、関係、またはアイテム拡張を見つける。これら以外の型が指定されていれば、ArgumentExceptionをスローする。そのようなオブジェクトが見つからない場合、NULLを返す。
public object FindOne(Type type, string filter);
//与えられたフィルタ条件を満たす指定された型のアイテム、関係、またはアイテム拡張を見つける。これら以外の型が指定されていれば、ArgumentExceptionをスローする。そのようなオブジェクトが見つからない場合、ObjectNotFoundExceptionをスローする。複数のオブジェクトが見つからなかった場合、MultipleObjectsFoundExceptionをスローする。
public object FindOnly(Type type, string filter);
//与えられたフィルタ条件を満たす指定された型のアイテム、関係、またはアイテム拡張が存在する場合、trueを返す。これら以外の型が指定されていれば、ArgumentExceptionをスローする。
public bool Exists(Type type, string filter);
//検索により返されるオブジェクトがItemContextにより保持されるオブジェクト識別マップにどのように関係するかを指定する。
public SearchCollisionMode SearchCollisionMode {get; set;}
//ResultMappingについてPreserveModifiedObjectsが指定されている場合に発生する。このイベントにより、アプリケーションは、検索により取り出されたデータとともに修正されたオブジェクトを選択的に更新することができる。
public event ChangeCollisionEventHandler SearchCollision;
//他のItemContextからのオブジェクトをこのアイテムコンテクストに組み込む。同じアイテム、関係、アイテム拡張を表すオブジェクトがすでに存在しているわけではない場合、このItemContextの識別マップ、オブジェクトのクローンが作成され、マップに追加される。オブジェクトが存在する場合、これは、SearchCollisionModeと一致する方法で指定されたオブジェクトの状態および内容とともに更新される。
public Item IncorporateItem(Item item);
public Relationship IncorporateRelationship(Relationship relationship);
public ItemExtension IncorporateItemExtension(ItemExtension itemExtension);
}
//ItemContext.UpdateCollisionおよびItemSearcher.SearchCollisionイベントのハンドラ。
public delegate void ChangeCollisionEventHandler(object source, ChangeCollisionEventArgs args);
//ChangeCollisionEventHandlerデリゲートの引数。
public class ChangeCollisionEventArgs : EventArgs
{
//修正されたアイテム、アイテム拡張、または関係オブジェクト。
public object ModifiedObject {get;}
//ストアからのプロパティ。
public IDictionary StoredProperties {get;}
}
//ItemContext.UpdateProgressのハンドラ。
public delegate void UpdateProgressEventHandler(ItemContext itemContext, UpdateProgressEventArgs args);
//UpdateProgressEventHandlerデリゲートの引数。
public class ChangeCollisionEventArgs : EventArgs
{
//現在の更新オペレーション。
public UpdateOperation CurrentOperation {get;}
//現在更新中のオブジェクト。
public object CurrentObject {get;}
}
//検索により返されるオブジェクトがItemContextにより保持されるオブジェクト識別マップにどのように関係するかを指定する。
public enum SearchCollisionMode
{
//新しいオブジェクトを作成し、返さなければならないことを示す。識別マップ内の同じアイテム、アイテム拡張、または関係を表すオブジェクトは無視される。このオプションが指定されている場合、SearchCollisionイベントは発生しない。
DoNotMapSearchResults,
//識別マップからのオブジェクトを返さなければならないことを示す。オブジェクトの内容がアプリケーションにより修正された場合、修正されたオブジェクトの内容は保存される。オブジェクトが修正されていなかった場合、その内容は検索により返されたデータとともに更新される。Applicationは、SearchCollisionイベントに対するハンドラを用意し、必要に応じてオブジェクトを選択的に更新することができる。
PreserveModifiedObjects,
//識別マップからのオブジェクトを返さなければならないことを示す。オブジェクトの内容は、そのオブジェクトがアプリケーションにより修正されていたとしても、検索により返されたデータとともに更新される。このオプションが指定されている場合、SearchCollisionイベントは発生しない。
OverwriteModifiedObjects
}
//現在の更新オペレーション。
public enum UpdateOperation
{
//Updateが最初に呼び出されたときに与えられる。CurrentObjectはnullとなる。
OverallUpdateStarting,
//更新が成功した後、Updateが戻る直前に与えられる。CurrentObjectはNULLとなる。
OverallUpdateCompletedSucessfully,
//Updateが例外をスローする直前に与えられる。CurrentObjectは、例外オブジェクトとなる。
OverallUpdateCompletedUnsuccessfully,
//オブジェクトの更新が開始したときに与えられる。CurrentObjectは、更新に使用されるオブジェクトを参照する。
ObjectUpdateStarting,
//新しい接続が必要な場合に与えられる。CurrentObjectは、ItemContext.Openに渡されるようなアイテムドメインを識別するパスを含む文字列となる。関係のLocationフィールドから開くか、または取り出す。
OpeningConnection
}
}
付録B
namespace System.Storage
{
//アイテムコンテクスト内の特定の型について検索を実行する。
public class ItemSearcher
{
コンストラクタ
//マッチするオブジェクトを識別するために使用されるフィルタ。
public SearchExpressionCollection Filters {get;}
//検索されるドメインを指定するItemContext。
public ItemContext ItemContext {get; set;}
//検索パラメータコレクション。
public ParameterCollection Parameters {get;}
//サーチャーが動作する型。単純検索では、これは、返されるオブジェクトの型である。
public Type TargetType {get; set;}
検索メソッド
//Filtersにより指定された条件を満たすTargetTypeのオブジェクトを見つける。そのようなオブジェクトが存在しない場合には、空のFindResultを返す。
public FindResult FindAll();
public FindResult FindAll(FindOptions findOptions);
public FindResult FindAll(params SortOption[] sortOptions);
//Filtersにより指定された条件を満たすTargetTypeの1つのオブジェクトを見つける。
//そのようなオブジェクトが存在しない場合、NULLを返す。
public object FindOne();
public object FindOne(FindOptions findOptions);
public object FindOne(params SortOption[] sortOptions);
//Filtersにより指定された条件を満たすTargetTypeのオブジェクトを見つける。
//そのようなオブジェクトが見つからない場合、ObjectNotFoundExceptionをスローする。複数のオブジェクトが見つからなかった場合、MultipleObjectsFoundExceptionをスローする。
public object FindOnly();
public object FindOnly(FindOptions findOptions);
//Filtersにより指定された条件を満たすTargetTypeのオブジェクトが存在するかどうかを判別する。
public bool Exists();
//同じ検索を繰り返し効率よく実行するために使用することができるオブジェクトを作成する。
public PreparedFind PrepareFind();
namespace System.Storage
{
public abstract class FindResult : IAsyncObjectReader
{
public FindResult ();
//FindResultを結果の中の次の位置に移動する。
public bool Read ();
public IAsyncResult BeginRead(AsyncCallback callback, object state);
public bool EndRead(IAsyncResult asyncResult);
//現在のオブジェクト。
public object Current {get;}
//FindResultがオブジェクトを含むかどうかを返す。
public bool HasResults {get;}
//FindResultが閉じられているかどうかを返す。
public bool IsClosed {get;}
//このFindResult内のアイテムの型を返す。
public Type ObjectType {get;}
//FindResultを閉じる。
public void Close();
void IDisposable.Dispose();
//現在位置から始まる、FindResult上の列挙子を返す。FindResult上の列挙子を進めることで、すべての列挙子が進むだけでなく、FindResult自体も進む。
IEnumerator IEnumerable.GetEnumerator();
public FindResultEnumerator GetEnumerator();
}
public abstract class FindResultEnumerator : IEnumerator, IDisposable
{
public abstract object Current {get;}
public abstract bool MoveNext();
public abstract void Reset();
public abstract void Close();
void IDisposable.Dispose();
}
}
namespace System
{
//オブジェクト上で繰り返すための共通インターフェース
public interface IObjectReader : IEnumerable, IDisposable
Claims (19)
- ストレージプラットフォームであって、
データベースエンジンと、
データを格納するためデータベースエンジン上に実装されデータストアであって、前記データストアに格納されるデータの編成、検索、共有、同期、およびセキュリティをサポートするデータモデルを実装し、特定の型のデータがスキーマで記述される、データストアと、
アプリケーションプログラムがサービスおよび前記ストレージプラットフォームの機能にアクセスすること、および前記スキーマ内に記述されている前記データにアクセスすることを可能にするアプリケーションプログラミングインターフェースとを備え、
前記ストレージプラットフォームは、さらに、既存のファイルシステムとの相互運用性をサポートし、ユーザおよびシステムが前記データストアの異なるインスタンスに格納されているデータの同期をとることを可能にし、アプリケーションプログラムが前記データストア内の前記データに加えられた変更について通知を受け取り、変更を追跡する機能を備えることを特徴とするストレージプラットフォーム。 - 前記データストア内のデータは、アイテム、要素、および関係に関して定義され、アイテムは、前記データストア内に格納可能なデータのユニットであり、1つまたは複数の要素を含み、要素は、1つまたは複数のフィールドを含む型のインスタンスであり、関係は、少なくとも2つのアイテムの間のリンクであることを特徴とする請求項1に記載のストレージプラットフォーム。
- 請求項2に記載のストレージプラットフォームであって、前記ストレージプラットフォームは、異なる型のアイテム、要素、および関係を定義するスキーマの集合をさらに含み、前記アプリケーションプログラミングインターフェースは、スキーマの前記集合内で定義されている前記異なるアイテム、要素、および関係のそれぞれに対するクラスを含むことを特徴とするストレージプラットフォーム。
- データは、既存のアイテム型に対する拡張の形で前記データストアに格納されることも可能であり、前記アプリケーションプログラミングインターフェースは、それぞれの異なるアイテム拡張に対するクラスを含むことを特徴とする請求項3に記載のストレージプラットフォーム。
- アイテム、要素、および関係のそれぞれの型に対する前記クラスは、アイテム、要素、および関係のそれぞれの型を定義するスキーマの前記集合に基づき自動的に生成されることを特徴とする請求項3に記載のストレージプラットフォーム。
- アイテム、要素、および関係のそれぞれの型に対する前記クラスは、データクラスの集合を定義し、前記アプリケーションプログラミングインターフェースは、前記データクラスに対するビヘイビアの共通集合を定義するクラスの第2の集合をさらに含むことを特徴とする請求項3に記載のストレージプラットフォーム。
- クラスの前記第2の集合は、ストレージプラットフォームスコープを表し、前記データストア上のクエリに対する前記コンテクストを提供する第1のクラス、および前記データストア上のクエリの結果を表す第2のクラスを含むことを特徴とする請求項6に記載のストレージプラットフォーム。
- 前記データストア内の前記異なる型のアイテム、要素、および関係は、ユーザ定義型として前記データベースエンジン内に実装されることを特徴とする請求項3に記載のストレージプラットフォーム。
- 前記アプリケーションプログラミングインターフェースは、前記データベースエンジンの前記クエリ言語の詳細を意識することなく、アプリケーションプログラマが前記データストア内の前記アイテムの様々なプロパティに基づき、クエリを形成することを可能にするクエリモデルを実現することを特徴とする請求項8に記載のストレージプラットフォーム。
- 前記データストア内の複数のアイテムは、Item Folder、および前記Item Folderのメンバである少なくとも1つの他のアイテムを含むことができることを特徴とする請求項2に記載のストレージプラットフォーム。
- 前記データストア内の複数のアイテムは、Category、および前記Categoryのメンバである少なくとも1つの他のアイテムを含むことができることを特徴とする請求項2に記載のストレージプラットフォーム。
- 2つのアイテムの間の関係は、ハードウェア/ソフトウェアインターフェースシステムにより自動的に確立されることを特徴とする請求項2に記載のストレージプラットフォーム。
- 要素は、ハードウェア/ソフトウェアインターフェースシステムにより理解可能であることを特徴とする請求項2に記載のストレージプラットフォーム。
- 関係は、要素を含むことを特徴とする請求項2に記載のストレージプラットフォーム。
- スキーマの前記集合は、ストレージプラットフォームが所定の、予測可能な方法でCore Itemの前記集合を理解し、直接処理する際に使用するCore Itemの集合を定義するCore Schemaを含むことを特徴とする請求項3に記載のストレージプラットフォーム。
- Core Itemの前記集合内で定義されたアイテムのそれぞれの型は、単一の共通基本アイテムから派生することを特徴とする請求項15に記載のストレージプラットフォーム。
- 前記単一の共通基本アイテムは、基本スキーマ内の基礎的なアイテムであることを特徴とする請求項16に記載のストレージプラットフォーム。
- 前記データベースエンジンは、リレーショナルデータベースエンジンを含むことを特徴とする請求項1に記載のストレージプラットフォーム。
- 前記リレーショナルデータベースエンジンは、オブジェクトリレーショナル拡張を有するリレーショナルデータベースエンジンを含むことを特徴とする請求項18に記載のストレージプラットフォーム。
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
PCT/US2003/027419 WO2005029314A1 (en) | 2003-08-21 | 2003-08-21 | Storage platform for organizing, searching, and sharing data |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2007521537A true JP2007521537A (ja) | 2007-08-02 |
JP4394644B2 JP4394644B2 (ja) | 2010-01-06 |
Family
ID=34374773
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2005509111A Expired - Fee Related JP4394644B2 (ja) | 2003-08-21 | 2003-08-21 | データの編成、検索、および共有のためのストレージプラットフォーム |
Country Status (4)
Country | Link |
---|---|
EP (1) | EP1656610A4 (ja) |
JP (1) | JP4394644B2 (ja) |
AU (1) | AU2003270058A1 (ja) |
WO (1) | WO2005029314A1 (ja) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11940960B2 (en) | 2022-04-21 | 2024-03-26 | Folder Front, LLC | Intelligent folder-based data organization system |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7702802B2 (en) | 2004-12-03 | 2010-04-20 | Microsoft Corporation | Sharing framework for resource sharing |
CN100445997C (zh) * | 2005-12-30 | 2008-12-24 | 英业达股份有限公司 | 数据同步方法与系统 |
US9143563B2 (en) * | 2011-11-11 | 2015-09-22 | Rockwell Automation Technologies, Inc. | Integrated and scalable architecture for accessing and delivering data |
CN112424713A (zh) * | 2018-08-23 | 2021-02-26 | 西门子股份公司 | 人工智能计算设备、控制方法及装置、工程师站及工业自动化系统 |
US20210004743A1 (en) * | 2019-07-03 | 2021-01-07 | Gustavo Zarrate-Cardenas | Methods and systems for facilitating exploration of data to evaluate activities and behavioral patterns for making decisions |
CN111104456A (zh) * | 2019-10-12 | 2020-05-05 | 深圳壹账通智能科技有限公司 | 数据持久化存储方法、装置、计算机设备及存储介质 |
CN115113822B (zh) * | 2022-07-12 | 2024-11-05 | 北京天融信网络安全技术有限公司 | 一种数据处理方法和装置 |
Family Cites Families (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5136712A (en) * | 1989-06-29 | 1992-08-04 | Digital Equipment Corporation | Temporary object handling system and method in an object based computer operating system |
US6078925A (en) * | 1995-05-01 | 2000-06-20 | International Business Machines Corporation | Computer program product for database relational extenders |
US6519597B1 (en) * | 1998-10-08 | 2003-02-11 | International Business Machines Corporation | Method and apparatus for indexing structured documents with rich data types |
US6338056B1 (en) * | 1998-12-14 | 2002-01-08 | International Business Machines Corporation | Relational database extender that supports user-defined index types and user-defined search |
US6199195B1 (en) * | 1999-07-08 | 2001-03-06 | Science Application International Corporation | Automatically generated objects within extensible object frameworks and links to enterprise resources |
US7131107B2 (en) | 2000-07-03 | 2006-10-31 | Oculus Technologies Corporation | Method for mapping business processes using an emergent model on a computer network |
US6999956B2 (en) * | 2000-11-16 | 2006-02-14 | Ward Mullins | Dynamic object-driven database manipulation and mapping system |
US6697818B2 (en) * | 2001-06-14 | 2004-02-24 | International Business Machines Corporation | Methods and apparatus for constructing and implementing a universal extension module for processing objects in a database |
-
2003
- 2003-08-21 JP JP2005509111A patent/JP4394644B2/ja not_active Expired - Fee Related
- 2003-08-21 WO PCT/US2003/027419 patent/WO2005029314A1/en active Application Filing
- 2003-08-21 EP EP03751951A patent/EP1656610A4/en not_active Ceased
- 2003-08-21 AU AU2003270058A patent/AU2003270058A1/en not_active Abandoned
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11940960B2 (en) | 2022-04-21 | 2024-03-26 | Folder Front, LLC | Intelligent folder-based data organization system |
Also Published As
Publication number | Publication date |
---|---|
EP1656610A4 (en) | 2008-06-11 |
EP1656610A1 (en) | 2006-05-17 |
WO2005029314A1 (en) | 2005-03-31 |
AU2003270058A1 (en) | 2005-04-11 |
JP4394644B2 (ja) | 2010-01-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP4394643B2 (ja) | アイテムベースのストレージプラットフォームにおけるデータモデリングのためのシステムおよび方法 | |
US7428546B2 (en) | Systems and methods for data modeling in an item-based storage platform | |
US7555497B2 (en) | Systems and methods for separating units of information manageable by a hardware/software interface system from their physical organization | |
US7349913B2 (en) | Storage platform for organizing, searching, and sharing data | |
US7483915B2 (en) | Systems and method for representing relationships between units of information manageable by a hardware/software interface system | |
US8131739B2 (en) | Systems and methods for interfacing application programs with an item-based storage platform | |
US7529811B2 (en) | Systems and methods for the implementation of a core schema for providing a top-level structure for organizing units of information manageable by a hardware/software interface system | |
US7739316B2 (en) | Systems and methods for the implementation of base schema for organizing units of information manageable by a hardware/software interface system | |
AU2003259961B2 (en) | Systems and methods for interfacing application programs with an item-based storage platform | |
JP4583377B2 (ja) | ハードウェア/ソフトウェアインターフェースシステムにより管理可能な情報のユニットに対する関係および階層の同期サービスを実現するシステムおよび方法 | |
US20050055354A1 (en) | Systems and methods for representing units of information manageable by a hardware/software interface system but independent of physical representation | |
JP4583376B2 (ja) | ハードウェア/ソフトウェアインタフェースシステムにより管理可能な情報のユニットに対する同期処理サービスを実現するシステムおよび方法 | |
JP4580390B2 (ja) | ハードウェア/ソフトウェアインターフェイスシステムによって管理可能な情報単位の拡張および継承のためのシステムおよび方法 | |
JP4583375B2 (ja) | 同期スキーマの実装のためのシステム | |
JP2007527053A (ja) | 仲介ファイルシステム共有または仲介デバイスを介してコンピュータシステムを同期させるためのシステムおよび方法 | |
JP4394644B2 (ja) | データの編成、検索、および共有のためのストレージプラットフォーム | |
RU2371757C2 (ru) | Системы и способы моделирования данных в основанной на предметах платформе хранения | |
RU2412461C2 (ru) | Системы и способы сопряжения прикладных программ с платформой хранения на основе статей | |
ZA200600644B (en) | Systems and methods for interfacing application programs with an item-based storage platform |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20090522 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20090824 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20090915 |
|
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20091015 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 4394644 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20121023 Year of fee payment: 3 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20131023 Year of fee payment: 4 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
S111 | Request for change of ownership or part of ownership |
Free format text: JAPANESE INTERMEDIATE CODE: R313113 |
|
R350 | Written notification of registration of transfer |
Free format text: JAPANESE INTERMEDIATE CODE: R350 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
LAPS | Cancellation because of no payment of annual fees |