檔案伺服器之三:儲存

來源:互聯網
上載者:User

儲存
*相關流的集合
*用於實現對象的持久性
*通常,儲存是一個檔案
 - 儘管也提供記憶體儲存
 - 儲存也可以嵌入其它儲存的流中
*出於各種考慮,取代直接使用檔案和檔案伺服器用戶端API
 - 儘管與檔案伺服器的其它特徵依然相關
*對於應用程式的架構意義重大,因為它提供對嵌入文檔的支援
*儲存也是DBMS提供的相關資料庫的基礎

 

 

儲存流
*在儲存中適合使用流這種類型
*流通常是在儲存地上下文中建立的
*儲存中的流由如下兩個具體類中的一個封裝
 - RStoreWriteStream代表寫入流
  ·支援儲存中流的建立和操作
 - RStorReadStream代表讀取流
  ·支援儲存中已存在的流的開啟的操作

 

 

流ID
*在儲存中,流的唯一的標識
 - 由TStreamId類封裝
*用於給定的儲存上下文中,並用來開啟流
 - 比如 RStoreReadStream::OpenLC(CFileStore& store, TStreamId streamId);
*TStreamId提供ExternalizeL()和InternalizeL()函數
 - 流的ID可以外部化到其它流中,這是流網路的基礎
*在儲存中儲存
 - 如果只有一個流,那麼流ID儲存在儲存根中
 - 如果儲存包含不止一個流,那麼流ID儲存在流字典中

 

 

使用儲存流
*RStoreWriteStream
 - CreateL()或CreateLC()可以在儲存中建立一個新的流
 - OpenL()或OpenLC()可以在儲存中開啟一個已經存在的流用於寫操作
  ·注意,並不是所有的儲存類型都支援已有的流的修改操作
 - CommitL()執行流的外部化操作
  ·作為一條簡單的準則,CreateL()或CreateLC()通過調用CommitL()得以匹配
*RStoreReadStream
 - OpenL()或OpenLC()在儲存中開啟已有的流用於讀操作

使用儲存流-樣本
*使用RStoreWriteStream的CreateL()或CreateLC()成員函數在儲存中建立一個新的流,並且返回該流的ID
RStoreWriteStream outstream;
TStreamId id = outstream.CreateLC(*store);
...
CleanupStack::PopAndDestory();
...
*使用RStoreReadStream的OpenL()或OpenLC()成員函數來開啟一個流,並且用於讀取操作
RStoreReadStream instream;
TStream id;
...
instream.OpenLC(*store,id);
...

 

儲存類型
*CStreamStore定義了在儲存中添加和刪除流的介面
 - 也提供執行/恢複機制,以及空間壓縮和回收
*儲存類型基於流儲存範例
 - 持久儲存
 - 嵌入儲存
 - 字典儲存
 - 記憶體儲存

 

持久儲存
*在建立儲存的應用程式的生命週期之外,提供儲存的持久性
 - 比如,檔案儲存體
*尤其提供
 - 根流,通過它可以找到儲存中所有的其它的流
 - 開啟和關閉儲存的函數
*CPersistentStore,繼承自CStreamStore

檔案儲存體
*檔案儲存體是持久性的儲存,它可以用來實現應用程式的資料檔案
*CFileStore派生的檔案儲存體有兩種類型
 - 直接檔案儲存體,由具體類CDirectFileStore進行封裝
  ·直接檔案儲存體適用於將資料記憶體拷貝作為主要拷貝的應用程式,比如文文書處理器,這類應用程式實現了經典的載入/儲存範例
 - 持久檔案儲存體,有具體類CPermanetFileStore進行封裝
  ·通常,持久檔案儲存體適用於資料庫應用程式,這類應用程式將所有的資料儲存在檔案中,但是偶爾會編輯資料庫中的一些條目

使用檔案儲存體
*CreateLC()建立一個儲存
*RepalceLC()替換已有儲存
*Open()或OpenLC()開啟一個已有儲存
*File()從儲存中獲得RFile對象的拷貝
*Detach()將儲存和檔案分離,實際上是放棄了檔案的所有權
*Reattach()重建立立檔案和檔案儲存體的關聯,實際上是擷取該檔案的所有權

使用檔案儲存體- 樣本
*在如下的程式碼片段中
 - 與檔案儲存體相關聯的檔案被分離和關閉
 - 該檔案然後重新開啟並和該檔案儲存體重建立立關聯

LOCAL_C void doUseL(const TDesC& aName)
{
 TParse filestorename;
 ...
 fsSession.Parse(aName,filestorename);
 CFileStore* store = CPermanentFileStore::OpenLC(fsSession, filestorename, FullName(), EFileRead|EFileWrite);
 RFile thefile = store->File();
 store->Detach();
 thefile.Close();
 ...
 thefile.Open(fsSession,filestorename.FullName(), EFileRead|EFileWrite);
 store->Reattach(thefile);
 ...
}

 

嵌入儲存
*可以在其它儲存中以流的形式儲存
*用來代表一個部分對象網路
 - 通過從包含的儲存中拷貝(或刪除)主要的流,可以更加簡便地實現部分對象網路操作
*行為和直接檔案儲存體類似
 - 一旦寫入,儲存中的流就不能被修改
*用於嵌入應用程式架構的對象
 - 只能嵌入直接代表文檔的類型
*CEmbeddedStore,繼承自CPersistentstore

 

字典儲存
*按照通常方式包含流,但是不同的是,根流是流字典
 - 流通過UID訪問,而不是直接通過流ID訪問
 - 主要被應用程式架構用來處理.ini檔案
*介面由CDictionaryStore抽象類別提供
 - CDictionaryFileStore是具體類的一個樣本,它使用檔案儲存體來實現
*並非繼承自CStreamStore,但是擁有自己的持久儲存CPersistentStore和流字典CStreamDictionary
*特殊的流類型RDictionaryWriteStream和RDictionaryReadStream主要用於字典儲存

流字典
*維持一張列表,用來保持UID和流ID之間的對應關係
 - UID按照特定的目的來標識流
*每一個TUid和TStreamId對構成了數組的一個條目
*類型CStreamDictionary
 - 提供成員函數來管理數組條目,比如,添加新的條目,或者改變與UID相關聯的流ID
*系統初始設定檔案使用了流字典

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.