125 Star 882 Fork 312

GVP朱天龙 (Armink) / FlashDB

 / 详情

龙哥 时序数据库加个 倒序检索,数据记录一般检索结果是最近时间的在前面,自己改了改,不会提交ヽ(゚∀゚*)ノ━━━ゥ♪,先贴在这里

待办的
创建于  
2021-12-26 22:42
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, &sector, 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(&sector, &tsl)) != FAILED_ADDR);
        }
    } while ((sec_addr = get_last_sector_addr(db, &sector, traversed_len)) != FAILED_ADDR);
}

评论 (3)

Draven 创建了任务
Draven 修改了描述
展开全部操作日志

感谢你哈,我计划在 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, &sector, 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(&sector, &tsl)) != FAILED_ADDR);
        }
    } 
    else if (sector.status == FDB_SECTOR_STORE_EMPTY) 
    {
        return;
    }
} 
while ((sec_addr = get_last_sector_addr(db, &sector, traversed_len)) != FAILED_ADDR);

}

加一个按时间倒叙迭代的

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(3)
9021 armink 1578914611
C
1
https://gitee.com/Armink/FlashDB.git
git@gitee.com:Armink/FlashDB.git
Armink
FlashDB
FlashDB

搜索帮助