dbm与mysql区别_dbm数据库
所有版本的linux以及大多數(shù)的UNIX版本都隨系統(tǒng)帶有一個(gè)基本的、但卻非常搞笑的數(shù)據(jù)存儲(chǔ)歷程集,他被稱為dbm數(shù)據(jù)庫(kù)。適用于存儲(chǔ)比較靜態(tài)的索引化數(shù)據(jù)庫(kù),即使用索引來(lái)存儲(chǔ)可變長(zhǎng)的數(shù)據(jù)結(jié)構(gòu),然后通過(guò)索引或順序掃描數(shù)據(jù)庫(kù)來(lái)檢索結(jié)構(gòu),適用于處理那些被頻繁訪問(wèn)但卻很少被更新的數(shù)據(jù),因?yàn)閯?chuàng)建數(shù)據(jù)項(xiàng)時(shí)非常慢,而檢索時(shí)非???。
dbm數(shù)據(jù)庫(kù)存在著各種不同的版本,他們的API接口和特性都有一些細(xì)微的差別。最初的dbm集,又有“新”的被稱為ndbm的dbm集,還有GNU的dbm實(shí)現(xiàn)gdbm。GNU的實(shí)現(xiàn)版本雖然可以模擬舊版本的dbm和ndbm接口,但本身的接口和其他實(shí)現(xiàn)版本相比,還是有著顯著的不同。大多數(shù)主流的Linux發(fā)行版都會(huì)默認(rèn)安裝gdbm,但一些發(fā)行版,就需要安裝,如Ubuntu——需要安裝libgdbm-dev。
雖說(shuō)你已經(jīng)安裝了gdbm和ndbm了,系統(tǒng)在默認(rèn)情況下支持ndbm模式,你還要知道如何編譯這些源文件。例如安裝了gdbm,需如下操作:
(1) 在C源文件中包含頭文件ndbm.h;
(2) 使用編譯行選項(xiàng)-I/usr/include/gdbm包含頭文件目錄/usr/include/gdbm;
(3) 使用編譯行選項(xiàng)-lgdbm連接gdbm庫(kù)
然而,如果你安裝的是libgdbm-dev,且需要ndbm兼容模式,必須明確指定他,并且在鏈接主函數(shù)庫(kù)之前鏈接兼容庫(kù)。操作如下:
(1) 在C源文件中包含頭文件gdbm.h,而不是ndbm.h;
(2) 使用編譯行選項(xiàng)-I/usr/include/gdbm包含頭文件目錄/usr/include/gdbm;
(3) 使用編譯行選項(xiàng)-lgdbm_compat連接其他的gdbm庫(kù)
注意:在gdbm兼容模式下C源文件的頭文件要包含如果不是,則用gdbm-ndbm.h文件替換ndbm.h。
1.準(zhǔn)備工作
在開(kāi)始解釋每個(gè)dbm函數(shù)之前,你必須明白dbm數(shù)據(jù)庫(kù)能夠做什么,這會(huì)更好的幫助你理解該如何使用dbm函數(shù)。
dbm數(shù)據(jù)庫(kù)的基本袁術(shù)是需要存儲(chǔ)的數(shù)據(jù)以及與他關(guān)聯(lián)的在檢索數(shù)據(jù)時(shí)用作關(guān)鍵字的數(shù)據(jù)塊。每個(gè)dbm數(shù)據(jù)庫(kù)必須針對(duì)對(duì)每個(gè)要存儲(chǔ)的數(shù)據(jù)有一個(gè)唯一的關(guān)鍵字。關(guān)鍵字的取值被用作存儲(chǔ)數(shù)據(jù)的索引。dbm對(duì)于關(guān)鍵字和數(shù)據(jù)沒(méi)有限制,對(duì)使用超長(zhǎng)關(guān)鍵字和數(shù)據(jù)的情況也為定義任何錯(cuò)誤。規(guī)范允許具體實(shí)現(xiàn)把關(guān)鍵字/數(shù)據(jù)對(duì)的長(zhǎng)度限制為1023個(gè)字節(jié),但具體實(shí)現(xiàn)通常不會(huì)進(jìn)行限制,這是因?yàn)榫唧w實(shí)現(xiàn)往往要比技術(shù)規(guī)范所要求的更靈活。
為了操作這些數(shù)據(jù)塊,頭文件ndbm.h定義了一個(gè)名為datum的新數(shù)據(jù)類型。該類型確切的內(nèi)容依賴于集體實(shí)現(xiàn),但它至少包含下面兩個(gè)成員:
void *dptr;size_t dsize;
datum是一個(gè)用typedef語(yǔ)句定義的類型。在ndbm.h文件中還為dbm聲明了一個(gè)類型定義,它是一個(gè)用來(lái)訪問(wèn)數(shù)據(jù)的結(jié)構(gòu),其作用和用來(lái)訪問(wèn)文件FILE結(jié)構(gòu)很相似。還是那句話,dbm類型定義的內(nèi)部結(jié)構(gòu)依賴與具體實(shí)現(xiàn)。
在使用dbm庫(kù)是,如果要引用一個(gè)數(shù)據(jù)塊,必須聲明datum類型的變量,將成元dptr指向數(shù)據(jù)的起始點(diǎn),并把成員dsize設(shè)為包含數(shù)據(jù)的長(zhǎng)度。無(wú)論是待存儲(chǔ)的數(shù)據(jù)或用來(lái)訪問(wèn)他的索引都總是通過(guò)這個(gè)datum類型來(lái)引用。當(dāng)打開(kāi)一個(gè)dbm數(shù)據(jù)庫(kù)時(shí),通常會(huì)創(chuàng)建兩個(gè)物理文件,后綴分別是.pag和.dir并返回一個(gè)dbm指針,它被用來(lái)訪問(wèn)這兩個(gè)文件,且這兩個(gè)文件不應(yīng)該被直接讀寫,只能通過(guò)dbm例程來(lái)進(jìn)行。在一些視線中,這兩個(gè)文件被合并到一起,打開(kāi)數(shù)據(jù)庫(kù)只會(huì)創(chuàng)建一個(gè)文件。
2 dbm訪問(wèn)函數(shù)
DBM *dbm_open(const char *filename,int file_open_flags,mode_t file_mode); //filename基本文件名(不包含.dir .pag,返回一個(gè)指向DBM類型的指針。如果失敗,返回(DBM *)0int 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函數(shù)——用來(lái)打開(kāi)以后或創(chuàng)建數(shù)據(jù)庫(kù),第二個(gè)參數(shù)控制數(shù)據(jù)庫(kù)的讀、寫或讀/寫權(quán)限。如果要?jiǎng)?chuàng)建一個(gè)新的數(shù)據(jù)庫(kù),這個(gè)標(biāo)志必須與O_CREAT進(jìn)行二進(jìn)制或才允許被創(chuàng)建。第三個(gè)參數(shù)指定將被創(chuàng)建的文件的權(quán)限。
2.dbm_store函數(shù)——將數(shù)據(jù)存儲(chǔ)數(shù)據(jù)庫(kù)中。為了定義你想要存儲(chǔ)的數(shù)據(jù)和用來(lái)引用它的索引,必須設(shè)置兩個(gè)datum類型的參數(shù);一個(gè)用于引用索引,一個(gè)用于實(shí)際數(shù)據(jù)。store_mode用于控制當(dāng)試圖以一個(gè)已有的關(guān)鍵字存儲(chǔ)數(shù)據(jù)時(shí)會(huì)發(fā)生的情況:設(shè)置為dbm_insert,存儲(chǔ)操作將失敗并且dbm_store返回1;設(shè)置為dbm_replace,則新數(shù)據(jù)將覆蓋已有數(shù)據(jù)并且dbm_store返回0;當(dāng)發(fā)生其他錯(cuò)誤,dbm_store將返回一個(gè)負(fù)值。
3.dbm_fetch函數(shù)——用于從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù)。它使用一個(gè)先前dbm_open函數(shù)返回的指針和一個(gè)指向關(guān)鍵字的datum類型結(jié)構(gòu)作為其參數(shù)。它返回一個(gè)datum結(jié)構(gòu)類型(雖說(shuō)返回的僅僅包含一個(gè)指向數(shù)據(jù)的指針。實(shí)際數(shù)據(jù)依然保存在dbm庫(kù)的本地存儲(chǔ)空間中,在繼續(xù)調(diào)用dbm函數(shù)前,必須把數(shù)據(jù)復(fù)制到程序的變量中才行)。如果數(shù)據(jù)庫(kù)中找到與這個(gè)關(guān)鍵字關(guān)聯(lián)的數(shù)據(jù),返回的datum結(jié)構(gòu)的dptr和dsize成員的值將被設(shè)為相應(yīng)數(shù)據(jù)的值。如果沒(méi)有找到關(guān)鍵字,dptr將被設(shè)置為null。
4.dbm_close函數(shù)——關(guān)閉dbm_open打開(kāi)的數(shù)據(jù)庫(kù)。
3 其他dbm函數(shù)
int dbm_delete(DBM *database_descriptor,datum key);//從數(shù)據(jù)庫(kù)中刪除數(shù)據(jù),成功時(shí)返回0.int dbm_error(DBM *database_descriptor);//只是用于測(cè)試數(shù)據(jù)庫(kù)中是否有錯(cuò)誤發(fā)生,如果沒(méi)有就返回0.int dbm_clearerr(DBM *database_descriptor);//用于清楚數(shù)據(jù)庫(kù)中所有已被置位的錯(cuò)誤條件標(biāo)志datum dbm_firstkey(DBM *database_descriptor);datum dbm_nextkey(DBM *database_descriptor);//這兩個(gè)函數(shù)一般稱對(duì)使用來(lái)對(duì)數(shù)據(jù)庫(kù)中的所有關(guān)鍵字進(jìn)行掃描。
總結(jié)
以上是生活随笔為你收集整理的dbm与mysql区别_dbm数据库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ReportNG测试报告的定制修改
- 下一篇: 数据库的分发与复制