3.02.2017

Linux DBM DataBase

這一次,自己要記錄下來的學習心得是Linux系統下的DBM (Data Base Management)資料庫。就自己的工作經驗上,這個DBM資料庫根本就沒用過,不過也就是因為沒用過,所以才想要刻意地記錄下來。

DBM資料庫,比較像是一個非常簡單的「索引式檔案儲存系統」,它並沒有像微軟的MS-SQL Server或是Linux平臺下的MySQL這麼的完善,或是功能強大。

先來瞭解一下,跟DBM資料庫有相關的函式有那些:

1. DBM *dbm_open(const char *file, int open_flags, mode_t file_mode);
dbm_open()函式和dbm_close()這2個函式是一對的,就好像fopen()-fclose()open()-close()一樣。dbm_open()函式會傳進3個參數:
第1個參數file,指的是資料庫的路徑。dbm_open()會在路徑下開啟2個檔案:(FileName).dir和(FileName).pag。
第2個參數open_flags和第3個參數file_mode的用法,等同於open()函式,在此不再贅述。
若dbm_open()函式開啟資料庫成功,會回傳一個指到DBM資料結構的指標;反之則是回傳(DBM *)NULL。

2. int dbm_store(DBM *db, datum key, datum content, int store_mode);
dbm_store()函式的主要功能就是儲存一筆資料
第1個參數db,就是我們在之前dbm_open()所回傳的指標。
第2個參數key,鑰匙!它的概念就是假設有一筆資料,有10個欄位,我把第3個欄位的值設成key,換句話說,我必須透過這第3個欄位的key值才能夠找到這一筆資料。
第3個參數content,就是指整筆資料的內容。
第4個參數store_mode,只有2種用法:DBM_INSERTDBM_REPLACE
當要儲存一筆資料時,這一筆資料的key值跟之前儲存過的資料有重覆,且store_mode設定成DBM_REPLACE,那麼,這一筆新的資料就會取代掉原本舊的資料。
當要儲存一筆資料時,這一筆資料的key值跟之前儲存過的資料有重覆,但store_mode卻設成DBM_INSERT,那麼,舊有的資料保持不變,而新的一筆資料會被忽略。
當要儲存一筆資料時,這一筆資料的key值跟之前儲存過的資料完全沒有重覆,無論store_mode設定成DBM_INSERT或DBM_REPLACE,這一筆資料都會被插入資料庫。
dbm_store()執行成功時,會回傳0,執行失敗時會回傳一個負數;假如第3個參數設成DBM_INSERT且dbm_store()有找到一筆已存在的資料,就會回傳1。

3. datum dbm_fetch(DBM *db, datum key);
dbm_fetch()函式的功能就是從資料庫中讀取一筆資料
第1個參數db,就是我們在之前dbm_open()所回傳的指標。
第2個參數key,就是當初我們儲存這一筆資料時,所設定的key值;現在dbm_fetch()透過這一個key值來找回該筆資料。
若dbm_fetch()執行成功有找到該筆資料,則回傳該筆資料,而該筆資料儲存在datum結構當中;執行失敗時,datum結構中的char *dptr成員則是被設成(char *)NULL

4. int dbm_delete(DBM *db, datum key);
dbm_delete()的用法跟dbm_fetch()類似,傳進去的2個參數也一樣;dbm_fetch()是讀取一筆資料,dbm_delete()則是刪除一筆資料
函式執行成功回傳0,執行失敗則是回傳一個負數。

5. datum dbm_firstkey(DBM *db);
6. datum dbm_nextkey(DBM *db);
這2個函式必須搭配使用,它們會掃描資料庫中所有的key值。它們的用法必須如下所示:
for (key = dbm_firstkey(db_ptr); key.dptr != (char *)NULL; key = dbm_nextkey(db_ptr)) { /* .... */ }
若dbm_firstkey()和dbm_nextkey()函式執行成功,則回傳該筆資料,且該筆資料儲存在datum結構中;執行失敗時,datum結構中的char *dptr成員則是被設成(char *)NULL。

7. int dbm_error(DBM *db);
dbm_error()函式會檢查一個資料庫是否有錯誤,沒有錯誤就會回傳0,反之則回傳一個非0的值。

8. int dbm_clearerr(DBM *db);
dbm_clearerr()會清除任何錯誤狀態的旗標,這是設定在資料庫中。而它的回傳值則沒有被指定。

9. void dbm_close(DBM *db);
請參閱dbm_open()函式。

基於以上這些DBM相關的函式,自己寫了一個很簡單的範例。不過,因為程序碼有點大,不太方便貼在部落格,所以我把它放在Google Drive,如下:https://drive.google.com/open?id=0B4hMTvUWgd_gRlNTSExueksyVnc

假如在編譯時沒有過,有可能是缺少了DBM的函式庫,自己用的版本是:gdbm-1.11-7.fc24.i686.rpmgdbm-devel-1.11-7.fc24.i686.rpm,把這兩個套件安裝起來即可!
[root@localhost]# rpm -ivh gdbm-1.11-7.fc24.i686.rpm
[root@localhost]# rpm -ivh gdbm-devel-1.11-7.fc24.i686.rpm

沒有留言:

張貼留言