FlashDB 是一款超輕量級的嵌入式數據庫,專注于提供嵌入式產品的數據存儲方案。與傳統的基于文件系統的數據庫不同,FlashDB 結合了 Flash 的特性,具有較強的性能及可靠性。并在保證極低的資源占用前提下,盡可能延長 Flash 使用壽命。
FlashDB 提供兩種數據庫模式:
https://gitee.com/armink/FlashDB
如今,物聯網產品種類越來越多,運行時產生的數據種類及總量及也在不斷變大。FlashDB 提供了多樣化的數據存儲方案,不僅資源占用小,并且存儲容量大,非常適合用于物聯網產品。下面是主要應用場景:
鍵值數據庫 :
產品參數存儲
用戶配置信息存儲
小文件管理
時序數據庫 :
#include?
#include?
#include?
#include?
#include?
#define?FDB_LOG_TAG?"[main]"
static?pthread_mutex_t?kv_locker;
static?uint32_t?init_data?=?0;
static?struct?fdb_kvdb?kvdb?=?{?0?};
static?struct?fdb_default_kv_node?default_kv_table[]?=?
{
????{"init_data",?&init_data,?sizeof(init_data)},?
};
static?void?lock(fdb_db_t?db)
{
????pthread_mutex_lock((pthread_mutex_t?*)db->user_data);
}
static?void?unlock(fdb_db_t?db)
{
????pthread_mutex_unlock((pthread_mutex_t?*)db->user_data);
}
int?main(void)
{
????fdb_err_t?result;
????bool?file_mode?=?true;
????uint32_t?sec_size?=?4096,?db_size?=?sec_size?*?4;
????struct?fdb_default_kv?default_kv;
????struct?fdb_blob?blob;
????//?默認?KV?集合
????default_kv.kvs?=?default_kv_table;
????default_kv.num?=?sizeof(default_kv_table)?/?sizeof(default_kv_table[0]);
????//?設置加解鎖函數
????pthread_mutex_init(&kv_locker,?NULL);
????fdb_tsdb_control(&tsdb,?FDB_TSDB_CTRL_SET_LOCK,?(void?*)lock);
????fdb_tsdb_control(&tsdb,?FDB_TSDB_CTRL_SET_UNLOCK,?(void?*)unlock);
????//?設置扇區
????fdb_kvdb_control(&kvdb,?FDB_KVDB_CTRL_SET_SEC_SIZE,?&sec_size);
????//?設置數據庫最大大小
????fdb_kvdb_control(&kvdb,?FDB_KVDB_CTRL_SET_MAX_SIZE,?&db_size);
????
????//?設置文件模式
????fdb_kvdb_control(&kvdb,?FDB_KVDB_CTRL_SET_FILE_MODE,?&file_mode);
????
????//?設置數據庫文件夾
????mkdir("fdb_kvdb1",?0777);
????//?初始化KV數據庫
????result?=?fdb_kvdb_init(&kvdb,?"env",?"fdb_kvdb1",?&default_kv,?&kv_locker);
????if?(result?!=?FDB_NO_ERR)?
????{
????????return?-1;
????}
????//?寫入UUID
????char?uuid_str[64]?=?"3F2504E0-4F89-11D3-9A0C-0305E82C3301";
????fdb_kv_set(&kvdb,?"uuid",?uuid_str);
????FDB_INFO("create?the?'uuid'?blob?KV,?value?is:?%s\n",?uuid_str);
????//?讀取UUID
????char?*return_value?=?NULL;
????char?dst_uuid_str[64]?=?{0};
????return_value?=?fdb_kv_get(&kvdb,?"uuid");
????if?(return_value?!=?NULL)?
????{
????????strncpy(dst_uuid_str,?return_value,?sizeof(dst_uuid_str));
????????FDB_INFO("get?the?'uuid'?value?is:?%s\n",?dst_uuid_str);
????}
????return?0;
}

fdb_kvdb_init為初始化kv數據庫的接口,需要傳參:
| db | 數據庫對象 |
|---|---|
| name | 數據庫名稱 |
| path | FAL 模式:分區表中的分區名,文件模式:數據庫保存的路徑 |
| default_kv | 默認 KV 集合,第一次初始化時,將會把默認 KV 寫入數據庫中 |
| user_data | 用戶自定義數據,沒有時傳入 NULL |
| 返回 | 錯誤碼 |
在初始化kv數據庫之前,可根據實際需要調用fdb_kvdb_control接口對數據庫進行一些控制設置操作。支持的命令控制字如下:
#define?FDB_KVDB_CTRL_SET_SEC_SIZE?????0x00?????????????/**
#define?FDB_KVDB_CTRL_GET_SEC_SIZE?????0x01?????????????/**
#define?FDB_KVDB_CTRL_SET_LOCK?????????0x02?????????????/**
#define?FDB_KVDB_CTRL_SET_UNLOCK???????0x03?????????????/**
#define?FDB_KVDB_CTRL_SET_FILE_MODE????0x09?????????????/**
#define?FDB_KVDB_CTRL_SET_MAX_SIZE?????0x0A?????????????/**
#define?FDB_KVDB_CTRL_SET_NOT_FORMAT???0x0B?????????????/**
這個demo基于Linux系統運行,需要設置成文件模式,存儲到文件中進行測試。
初始化 KVDB 前通常需要通過 control 函數設置 加鎖回調 與 解鎖回調 。對于裸機平臺,加鎖與解鎖回調通常設置為關中斷與開中斷函數。而 RTOS 平臺一般使用 mutex 互斥鎖或 二值信號量 的 take 及 release 動作作為加鎖與解鎖的方式。
更多例子及說明可以查閱源碼及相關文檔:
https://github.com/armink/FlashDB