dbm与mysql_DBM数据库 | 学步园
1. dbm數據庫
dbm數據庫適合于儲存相對比較靜態的索引化數據,是一個索引化得文件存儲系統。它的優點是非常容易被編譯進一個可發布的二進制可執行程序,因為它無需安裝獨立的服務器,而且即使它需要的底層文件還未安裝,也不會有什么危險。
dbm數據庫允許你通過使用索引來存儲可變長數據結構,然后通過索引或簡單的順序掃描數據庫來檢索結構。Dbm數據庫適用于處理那些被頻繁訪問但卻很少被更新的數據,因為它創建數據項時非常慢,而檢索時非??臁?/p>
2. dbm例程
dbm工具也是由頭文件和庫文件組成,而且庫文件必須在程序編譯時鏈接進來。庫文件被稱為dbm,因此鏈接它時需要加上選項-ldbm(-lgdbm)。其頭文件是ndbm.h。
dbm數據庫的基本元素是需要存儲的數據塊以及與它關聯的在檢索數據庫時用作關鍵字的數據塊。每個dbm數據庫必須有一個針對每個要存儲的數據塊的唯一關鍵字。規范中允許把關鍵字/數據對的長度限制為1023個字節,但通常不限制。關鍵字的取值被用作存儲數據的索引。
頭文件ndbm.h定義了一個名為datum的新數據類型,該類型確切內容依賴于具體實現,但它至少包括以下成員:
void *dptr;
size_t dsize;
datum是一個用typedef語句定義的類型。在ndbm.h中還定義了一個DBM類型,這是一個用來訪問數據庫的結構,其作用和用來訪問文件的FILE結構很相似。
當使用dbm庫時,要想引用一個數據塊,必須聲明一個datum類型的變量,將成員dptr指向數據的起始點,并把成員dsize設為數據的長度。無論是待存儲的數據還是用來訪問它的索引都總是通過一個datum類型來引用的。
當打開一個dbm數據庫時,將創建兩個物理文件,它們的后綴分別是.gag和.dir,而僅僅返回一個dbm指針,它被用來訪問這兩個文件。這兩個文件決不應該被直接讀寫,對它們的訪問一定要通過dbm例程來進行。
dbm數據庫工作在非結構化的二進制數據塊基礎上。
3. dbm訪問函數
#include
DBM *dbm_open(const char *filename, int
flags, mode_t file_mode);
int dbm_store(DBM *dbdes,? datum key, datum data, int store_mode);
datum dbm_fetch(DBM *dbdes, datum key);
void dbm_close(DBM *dbdes);
int dbm_delete(DBM *dbdes, datum key);
int dbm_error(DBM *dbdes);
int dbm_clearerr(DBM *dbdes);
datum dbm_firstkey(DBM *dbdes);
datum dbm_nextkey(DBM *dbdes);
3.1. db_open函數
這個函數用來打開一個已經存在或創建一個新數據庫,filename參數是一個基本文件名稱,不包括.dir或.pag后綴。
第二個參數控制數據庫的讀、寫或讀/寫權限。如果你是創建一個新的數據庫,這些標志必須與O_CREAT進行二進制或來允許文件被創建。
第三個參數指定被創建文件的初始權限。
dbm_open返回一個DBM類型的指針。它被用于所有后續對數據庫的訪問。如果失敗,返回(DBM*)0。
3.2. dbm_store函數
該函數是把數據存儲到數據庫中。為了定義我們希望存儲的數據和用來引用它的索引,必須設置兩個datum類型:一個用于索引,一個用于實際數據。最后一個store_mode用于控制當試圖以一個已有的關鍵字來存儲數據時發生地情況。如果它被設置為dbm_insert,存儲操作將失敗并且返回1。如果它被設置為dem_replace,新數據將覆蓋已有數據并且返回0。
當發生其他錯誤時,dbm_store返回一個負值。
3.3. dbm_fetch函數
該函數用于從數據庫中獲取數據。它使用一個前面dbm_open調用返回的指針和一個指向關鍵字的datum類型的結構。它將返回一個datum類型的結構。如果在數據庫中找到關聯這個關鍵字的數據,返回的datum結構的dptr和dsize成員的值將被設為相應的數據的值。如果沒有找到關鍵字,dptr將被設置為null。
3.4. dbm_close函數
該函數關閉用dbm_open打開的數據庫。
3.5. dbm_delete函數
該函數用于從數據庫中刪除數據項。成功返回0。
3.6. Dbm_error函數
該函數用于簡單的測試數據庫中是否有錯誤發生,如果沒有就返回0。
3.7. Dbm_clearerr函數
該函數用于清除數據庫中所有已經被置位的錯誤條件標志。
3.8. dbm_firstkey函數和dbm_nextkey函數
這兩個函數成對使用,用于對數據庫中的所有關鍵字進行掃描。
4. 實例
#include
#include
#include
#include
#include
#include
#define CONFIG_FILE "/root/dbm/access"
#define USER_AMOUNT 3
typedef struct tagUserAccess
{
char username[32];
int access;
} USER_ACCESS_S;
int main()
{
USER_ACCESS_S user_to_store[USER_AMOUNT];
USER_ACCESS_S user_to_retrieved;
char key_to_use[16];
int i, result;
datum key_datum;
datum data_datum;
DBM * dbm_des;
//創建一個數據庫用來讀寫
dbm_des = dbm_open(CONFIG_FILE, O_RDWR | O_CREAT, 0666);
if(!dbm_des)
{
printf("Failed to open database/n");
exit(EXIT_FAILURE);
}
//初始化待存儲的數據
memset(user_to_store, 0, sizeof(user_to_store));
for(i = 0; i < USER_AMOUNT; i++)
{
snprintf(user_to_store[i].username, sizeof(user_to_store[i].username),"%s%d","user",i);
user_to_store[i].access = i;
}
//存儲數據
for(i = 0; i < USER_AMOUNT; i++)
{
//用戶ID標示關鍵字
snprintf(key_to_use, sizeof(key_to_use),"%d",1000 + i);
key_datum.dptr = (void*)key_to_use;
key_datum.dsize = strlen(key_to_use);
data_datum.dptr = (void *)&user_to_store[i];
data_datum.dsize = sizeof(USER_ACCESS_S);
result = dbm_store( dbm_des, key_datum, data_datum, DMB_REPLACE);
if(0 != result)
{
printf("dbm_store:Failed to store the data/n");
exit(EXIT_FAILURE);
}
}
//獲取新存入的數據
snprintf(key_to_use, sizeof(key_to_use),"%d",1000 + 1);
key_datum.dptr = (void*)key_to_use;
key_datum.dsize = strlen(key_to_use);
data_datum = dbm_fetch(dbm_des, key_datum);
if(data_datum.dptr)
{
memcpy(&user_to_retrieved, data_datum.dptr, data_datum.dsize);
printf("Retrieved:username = %s, acces=%d/n", user_to_retrieved.username, user_to_retrieved.access);
}
else
{
printf("dbm_fetch:Failed to retrieve the data/n");
}
//關閉數據庫
dbm_close(dbm_des);
exit(EXIT_SUCCESS);
}
總結
以上是生活随笔為你收集整理的dbm与mysql_DBM数据库 | 学步园的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用计算机求a的平方根的顺序,算术平方根练
- 下一篇: dbm与mysql区别_dbm数据库