代码拉取完成,页面将自动刷新
static uint32_t get_last_tsl_addr(tsdb_sec_info_t sector, fdb_tsl_t pre_tsl) {
uint32_t addr = FAILED_ADDR;
if (sector->status == FDB_SECTOR_STORE_EMPTY) {
return FAILED_ADDR;
}
if (pre_tsl->addr.index >= LOG_IDX_DATA_SIZE + SECTOR_HDR_DATA_SIZE) {
addr = pre_tsl->addr.index - LOG_IDX_DATA_SIZE;
} else {
/* no TSL */
return FAILED_ADDR;
}
return addr;
}
static uint32_t get_last_sector_addr(fdb_tsdb_t db, tsdb_sec_info_t pre_sec, uint32_t traversed_len) {
if (traversed_len + db_sec_size(db) <= db_max_size(db)) {
if (pre_sec->addr > db_sec_size(db)) {
return pre_sec->addr - db_sec_size(db);
} else {
/* the last sector is on the bottom of the database */
return db_max_size(db) - db_sec_size(db);
}
} else {
/* finished */
return FAILED_ADDR;
}
}
void fdb_tsl_iter_reverse(fdb_tsdb_t db, fdb_tsl_cb cb, void* arg) {
struct tsdb_sec_info sector;
uint32_t sec_addr, traversed_len = 0;
struct fdb_tsl tsl;
if (!db_init_ok(db)) {
FDB_INFO("Error: TSL (%s) isn't initialize OK.\n", db_name(db));
}
if (cb == NULL) {
return;
}
sec_addr = db->cur_sec.addr;
/* search all sectors */
do {
traversed_len += db_sec_size(db);
if (read_sector_info(db, sec_addr, §or, false) != FDB_NO_ERR) {
continue;
}
/* sector has TSL */
if (sector.status == FDB_SECTOR_STORE_USING || sector.status == FDB_SECTOR_STORE_FULL) {
if (sector.status == FDB_SECTOR_STORE_USING) {
/* copy the current using sector status */
sector = db->cur_sec;
}
tsl.addr.index = sector.end_idx;
/* search all TSL */
do {
read_tsl(db, &tsl);
/* iterator is interrupted when callback return true */
if (cb(&tsl, arg)) {
return;
}
} while ((tsl.addr.index = get_last_tsl_addr(§or, &tsl)) != FAILED_ADDR);
}
} while ((sec_addr = get_last_sector_addr(db, §or, traversed_len)) != FAILED_ADDR);
}
感谢你哈,我计划在 V1.2 版本中加入逆序检索的功能,到时候参考一下
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
void fdb_tsl_iter_reverse_by_time(fdb_tsdb_t db, fdb_time_t from, fdb_time_t to, fdb_tsl_cb cb, void* arg)
{
struct tsdb_sec_info sector;
uint32_t sec_addr, oldest_addr = db->cur_sec.addr, traversed_len = 0;
struct fdb_tsl tsl;
bool found_start_tsl = false;
if (cb == NULL) {
return;
}
sec_addr = oldest_addr;
/* search all sectors */
do
{
traversed_len += db_sec_size(db);
if (read_sector_info(db, sec_addr, §or, false) != FDB_NO_ERR)
{
continue;
}
/* sector has TSL */
if ((sector.status == FDB_SECTOR_STORE_USING || sector.status == FDB_SECTOR_STORE_FULL))
{
if (sector.status == FDB_SECTOR_STORE_USING)
{
/* copy the current using sector status */
sector = db->cur_sec;
}
if ((found_start_tsl) || (!found_start_tsl && ((from >= sector.start_time && from <= sector.end_time)
|| (sec_addr == oldest_addr && from >= sector.end_time))))
{
uint32_t end = sector.end_idx, start = sector.addr + SECTOR_HDR_DATA_SIZE;
found_start_tsl = true;
/* search start TSL address, using binary search algorithm */
while (start <= end)
{
tsl.addr.index = start + ((end - start) / 2 + 1) / LOG_IDX_DATA_SIZE * LOG_IDX_DATA_SIZE;
read_tsl(db, &tsl);
if (tsl.time > from)
{
end = tsl.addr.index - LOG_IDX_DATA_SIZE;
}
else
{
start = tsl.addr.index + LOG_IDX_DATA_SIZE;
}
}
tsl.addr.index = end;
/* search all TSL */
do
{
read_tsl(db, &tsl);
if (tsl.status != FDB_TSL_UNUSED)
{
if (tsl.time <= from && tsl.time >= to)
{
/* iterator is interrupted when callback return true */
if (cb(&tsl, arg))
{
return;
}
}
else
{
return;
}
}
}
while ((tsl.addr.index = get_last_tsl_addr(§or, &tsl)) != FAILED_ADDR);
}
}
else if (sector.status == FDB_SECTOR_STORE_EMPTY)
{
return;
}
}
while ((sec_addr = get_last_sector_addr(db, §or, traversed_len)) != FAILED_ADDR);
}
登录 后才可以发表评论