dbm數據庫


  所有版本的linux以及大多數的UNIX版本都隨系統帶有一個基本的、但卻非常搞笑的數據存儲歷程集,他被稱為dbm數據庫。適用於存儲比較靜態的索引化數據庫,即使用索引來存儲可變長的數據結構,然后通過索引或順序掃描數據庫來檢索結構,適用於處理那些被頻繁訪問但卻很少被更新的數據,因為創建數據項時非常慢,而檢索時非常快。

  dbm數據庫存在着各種不同的版本,他們的API接口和特性都有一些細微的差別。最初的dbm集,又有“新”的被稱為ndbm的dbm集,還有GNU的dbm實現gdbm。GNU的實現版本雖然可以模擬舊版本的dbm和ndbm接口,但本身的接口和其他實現版本相比,還是有着顯著的不同。大多數主流的Linux發行版都會默認安裝gdbm,但一些發行版,就需要安裝,如Ubuntu——需要安裝libgdbm-dev。

  雖說你已經安裝了gdbm和ndbm了,系統在默認情況下支持ndbm模式,你還要知道如何編譯這些源文件。例如安裝了gdbm,需如下操作:

  (1) 在C源文件中包含頭文件ndbm.h;

  (2) 使用編譯行選項-I/usr/include/gdbm包含頭文件目錄/usr/include/gdbm;

  (3) 使用編譯行選項-lgdbm連接gdbm庫

  然而,如果你安裝的是libgdbm-dev,且需要ndbm兼容模式,必須明確指定他,並且在鏈接主函數庫之前鏈接兼容庫。操作如下:

  (1) 在C源文件中包含頭文件gdbm.h,而不是ndbm.h;

  (2) 使用編譯行選項-I/usr/include/gdbm包含頭文件目錄/usr/include/gdbm;

  (3) 使用編譯行選項-lgdbm_compat連接其他的gdbm庫

  注意:在gdbm兼容模式下C源文件的頭文件要包含<ndbm.h>如果不是,則用gdbm-ndbm.h文件替換ndbm.h。

1.准備工作

  在開始解釋每個dbm函數之前,你必須明白dbm數據庫能夠做什么,這會更好的幫助你理解該如何使用dbm函數。

  dbm數據庫的基本袁術是需要存儲的數據以及與他關聯的在檢索數據時用作關鍵字的數據塊。每個dbm數據庫必須針對對每個要存儲的數據有一個唯一的關鍵字。關鍵字的取值被用作存儲數據的索引。dbm對於關鍵字和數據沒有限制,對使用超長關鍵字和數據的情況也為定義任何錯誤。規范允許具體實現把關鍵字/數據對的長度限制為1023個字節,但具體實現通常不會進行限制,這是因為具體實現往往要比技術規范所要求的更靈活。

  為了操作這些數據塊,頭文件ndbm.h定義了一個名為datum的新數據類型。該類型確切的內容依賴於集體實現,但它至少包含下面兩個成員:

void *dptr;
size_t dsize;

  datum是一個用typedef語句定義的類型。在ndbm.h文件中還為dbm聲明了一個類型定義,它是一個用來訪問數據的結構,其作用和用來訪問文件FILE結構很相似。還是那句話,dbm類型定義的內部結構依賴與具體實現。

  在使用dbm庫是,如果要引用一個數據塊,必須聲明datum類型的變量,將成元dptr指向數據的起始點,並把成員dsize設為包含數據的長度。無論是待存儲的數據或用來訪問他的索引都總是通過這個datum類型來引用。當打開一個dbm數據庫時,通常會創建兩個物理文件,后綴分別是.pag和.dir並返回一個dbm指針,它被用來訪問這兩個文件,且這兩個文件不應該被直接讀寫,只能通過dbm例程來進行。在一些視線中,這兩個文件被合並到一起,打開數據庫只會創建一個文件。 

2 dbm訪問函數

DBM *dbm_open(const char *filename,int file_open_flags,mode_t file_mode);  //filename基本文件名(不包含.dir .pag,返回一個指向DBM類型的指針。如果失敗,返回(DBM *)0
int dbm_store(DBM *database_descriptor,datum key,datum content,int store_mode);
datum dbm_fetch(DBM *database_descriptor,datum key);
void dbm_close(DBM *database_descriptor);

  1.dbm_open函數——用來打開以后或創建數據庫,第二個參數控制數據庫的讀、寫或讀/寫權限。如果要創建一個新的數據庫,這個標志必須與O_CREAT進行二進制或才允許被創建。第三個參數指定將被創建的文件的權限。

  2.dbm_store函數——將數據存儲數據庫中。為了定義你想要存儲的數據和用來引用它的索引,必須設置兩個datum類型的參數;一個用於引用索引,一個用於實際數據。store_mode用於控制當試圖以一個已有的關鍵字存儲數據時會發生的情況:設置為dbm_insert,存儲操作將失敗並且dbm_store返回1;設置為dbm_replace,則新數據將覆蓋已有數據並且dbm_store返回0;當發生其他錯誤,dbm_store將返回一個負值。

  3.dbm_fetch函數——用於從數據庫中檢索數據。它使用一個先前dbm_open函數返回的指針和一個指向關鍵字的datum類型結構作為其參數。它返回一個datum結構類型(雖說返回的僅僅包含一個指向數據的指針。實際數據依然保存在dbm庫的本地存儲空間中,在繼續調用dbm函數前,必須把數據復制到程序的變量中才行)。如果數據庫中找到與這個關鍵字關聯的數據,返回的datum結構的dptr和dsize成員的值將被設為相應數據的值。如果沒有找到關鍵字,dptr將被設置為null。

  4.dbm_close函數——關閉dbm_open打開的數據庫。

3 其他dbm函數

int dbm_delete(DBM *database_descriptor,datum key);//從數據庫中刪除數據,成功時返回0.
int dbm_error(DBM *database_descriptor);//只是用於測試數據庫中是否有錯誤發生,如果沒有就返回0.
int dbm_clearerr(DBM *database_descriptor);//用於清楚數據庫中所有已被置位的錯誤條件標志
datum dbm_firstkey(DBM *database_descriptor);
datum dbm_nextkey(DBM *database_descriptor);//這兩個函數一般稱對使用來對數據庫中的所有關鍵字進行掃描。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM