mirror of
https://github.com/armink/FlashDB.git
synced 2025-01-29 04:32:53 +08:00
[kvdb] Add kvdb inergrity check API.
This commit is contained in:
parent
7e91b05483
commit
5ebf8e6e8f
@ -34,6 +34,7 @@ extern "C" {
|
|||||||
fdb_err_t fdb_kvdb_init (fdb_kvdb_t db, const char *name, const char *path, struct fdb_default_kv *default_kv,
|
fdb_err_t fdb_kvdb_init (fdb_kvdb_t db, const char *name, const char *path, struct fdb_default_kv *default_kv,
|
||||||
void *user_data);
|
void *user_data);
|
||||||
void fdb_kvdb_control(fdb_kvdb_t db, int cmd, void *arg);
|
void fdb_kvdb_control(fdb_kvdb_t db, int cmd, void *arg);
|
||||||
|
fdb_err_t fdb_kvdb_check(fdb_kvdb_t db);
|
||||||
fdb_err_t fdb_kvdb_deinit(fdb_kvdb_t db);
|
fdb_err_t fdb_kvdb_deinit(fdb_kvdb_t db);
|
||||||
fdb_err_t fdb_tsdb_init (fdb_tsdb_t db, const char *name, const char *path, fdb_get_time get_time, size_t max_len,
|
fdb_err_t fdb_tsdb_init (fdb_tsdb_t db, const char *name, const char *path, fdb_get_time get_time, size_t max_len,
|
||||||
void *user_data);
|
void *user_data);
|
||||||
|
@ -1897,4 +1897,50 @@ bool fdb_kv_iterate(fdb_kvdb_t db, fdb_kv_iterator_t itr)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The database inergrity check
|
||||||
|
*
|
||||||
|
* @param db database object
|
||||||
|
*
|
||||||
|
* @return result, FDB_NO_ERR: check OK
|
||||||
|
*/
|
||||||
|
fdb_err_t fdb_kvdb_check(fdb_kvdb_t db)
|
||||||
|
{
|
||||||
|
fdb_err_t result = FDB_NO_ERR;
|
||||||
|
uint32_t sec_addr, traversed_len = 0;
|
||||||
|
struct kvdb_sec_info sector;
|
||||||
|
struct fdb_kv kv;
|
||||||
|
|
||||||
|
if (!db_init_ok(db)) {
|
||||||
|
FDB_INFO("Error: KV (%s) isn't initialize OK.\n", db_name(db));
|
||||||
|
return FDB_INIT_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lock the KV cache */
|
||||||
|
db_lock(db);
|
||||||
|
|
||||||
|
sec_addr = db_oldest_addr(db);
|
||||||
|
/* search all sectors */
|
||||||
|
do {
|
||||||
|
traversed_len += db_sec_size(db);
|
||||||
|
result = read_sector_info(db, sec_addr, §or, false);
|
||||||
|
if (result == FDB_NO_ERR)
|
||||||
|
{
|
||||||
|
/* sector has KV */
|
||||||
|
if (sector.status.store == FDB_SECTOR_STORE_USING || sector.status.store == FDB_SECTOR_STORE_FULL) {
|
||||||
|
kv.addr.start = sector.addr + SECTOR_HDR_DATA_SIZE;
|
||||||
|
/* search all KV */
|
||||||
|
do {
|
||||||
|
result = read_kv(db, &kv);
|
||||||
|
} while ((kv.addr.start = get_next_kv_addr(db, §or, &kv)) != FAILED_ADDR && result == FDB_NO_ERR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while ((sec_addr = get_next_sector_addr(db, §or, traversed_len)) != FAILED_ADDR && result == FDB_NO_ERR);
|
||||||
|
|
||||||
|
/* unlock the KV cache */
|
||||||
|
db_unlock(db);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* defined(FDB_USING_KVDB) */
|
#endif /* defined(FDB_USING_KVDB) */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user