Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

迭代器无法遍历所有键值对 #294

Open
LiJingjie05 opened this issue Apr 24, 2024 · 2 comments
Open

迭代器无法遍历所有键值对 #294

LiJingjie05 opened this issue Apr 24, 2024 · 2 comments

Comments

@LiJingjie05
Copy link

LiJingjie05 commented Apr 24, 2024

无法使用迭代器遍历所有键值对,添加新的键值对之后,也无法通过迭代器遍历到这个键值对,但是如果直接调用get的接口,是可以读取到数据的。
这是遍历的代码:
`
void pt_check_wireless_device(uint8_t dbid, uint8_t type, uint8_t max_size)
{
struct fdb_kv_iterator iterator;
fdb_kv_t cur_kv;
struct fdb_blob blob;
size_t data_size;
uint8_t data_buf;
int32_t i = 0;
uint32_t y = 0;
uint32_t wireless_base_data = dbid
1000;
uint32_t addr = 0;

int count = 0;

fdb_kv_iterator_init(&iterator);

while (fdb_kv_iterate(ptr_pt_global_kvdb, &iterator)) 
{
    cur_kv = &(iterator.curr_kv);
    data_size = (size_t) cur_kv->value_len;
    data_buf = (uint8_t *) malloc(data_size);
    if (data_buf == NULL)
    {
        break;
    }
    fdb_blob_read((fdb_db_t) ptr_pt_global_kvdb, fdb_kv_to_blob(cur_kv, fdb_blob_make(&blob, data_buf, data_size)));

    // 无线设备键值解析
    y = atoi(cur_kv->name);
    i = y-(wireless_base_data);
    addr = *((uint32_t *)data_buf);
    PT_LOGD("[index:%d]kv_name:%s ,addr: 0x%x", count++, cur_kv->name, addr);
    if(i > 0 && i <max_size && !(addr & 0xff00000f) && addr != 0)
    {
        cache_wireless_id[cache_wireless_count].addr = addr;
        cache_wireless_id[cache_wireless_count].id = i;
        cache_wireless_id[cache_wireless_count].type = type;
        cache_wireless_count++;
        if(cache_wireless_count >= 128+32 -1)
        {
            return;
        }
    }

    free(data_buf);
}

}
`

这是读取和添加新键值对的代码:
`
pt_db_data_t read_data = {
.type = PT_DATA_UINT32
};
int err = pt_fdb_read(9, 1, &read_data);
PT_LOGD("err:%d addr:0x%x", err, read_data.val.val_u32);
rt_thread_mdelay(2000);

pt_db_data_t write_data = {
.type = PT_DATA_UINT32,
.val.val_u32 = 90,
.len = sizeof(uint32_t)
};

err = pt_fdb_write(31, 1, &write_data);
PT_LOGD("err:%d addr:0x%x", err, write_data.val.val_u32);
rt_thread_mdelay(2000);

err = pt_fdb_read(31, 1, &read_data);
PT_LOGD("err:%d addr:0x%x", err, read_data.val.val_u32);
rt_thread_mdelay(2000);

`
不管我如何添加新的键值对,迭代器都无法遍历到新的键值对,但是如果直接调用读取函数,是直接可以读取到的

@armink
Copy link
Owner

armink commented Apr 24, 2024

没啥思路,你先单步分析一下?

@YanChao001
Copy link

无法使用迭代器遍历所有键值对,添加新的键值对之后,也无法通过迭代器遍历到这个键值对,但是如果直接调用get的接口,是可以读取到数据的。 这是遍历的代码: ` void pt_check_wireless_device(uint8_t dbid, uint8_t type, uint8_t max_size) { struct fdb_kv_iterator iterator; fdb_kv_t cur_kv; struct fdb_blob blob; size_t data_size; uint8_t _data_buf; int32_t i = 0; uint32_t y = 0; uint32_t wireless_base_data = dbid_1000; uint32_t addr = 0;

int count = 0;

fdb_kv_iterator_init(&iterator);

while (fdb_kv_iterate(ptr_pt_global_kvdb, &iterator)) 
{
    cur_kv = &(iterator.curr_kv);
    data_size = (size_t) cur_kv->value_len;
    data_buf = (uint8_t *) malloc(data_size);
    if (data_buf == NULL)
    {
        break;
    }
    fdb_blob_read((fdb_db_t) ptr_pt_global_kvdb, fdb_kv_to_blob(cur_kv, fdb_blob_make(&blob, data_buf, data_size)));

    // 无线设备键值解析
    y = atoi(cur_kv->name);
    i = y-(wireless_base_data);
    addr = *((uint32_t *)data_buf);
    PT_LOGD("[index:%d]kv_name:%s ,addr: 0x%x", count++, cur_kv->name, addr);
    if(i > 0 && i <max_size && !(addr & 0xff00000f) && addr != 0)
    {
        cache_wireless_id[cache_wireless_count].addr = addr;
        cache_wireless_id[cache_wireless_count].id = i;
        cache_wireless_id[cache_wireless_count].type = type;
        cache_wireless_count++;
        if(cache_wireless_count >= 128+32 -1)
        {
            return;
        }
    }

    free(data_buf);
}

} `

这是读取和添加新键值对的代码: ` pt_db_data_t read_data = { .type = PT_DATA_UINT32 }; int err = pt_fdb_read(9, 1, &read_data); PT_LOGD("err:%d addr:0x%x", err, read_data.val.val_u32); rt_thread_mdelay(2000);

pt_db_data_t write_data = {
.type = PT_DATA_UINT32,
.val.val_u32 = 90,
.len = sizeof(uint32_t)
};

err = pt_fdb_write(31, 1, &write_data);
PT_LOGD("err:%d addr:0x%x", err, write_data.val.val_u32);
rt_thread_mdelay(2000);

err = pt_fdb_read(31, 1, &read_data);
PT_LOGD("err:%d addr:0x%x", err, read_data.val.val_u32);
rt_thread_mdelay(2000);

` 不管我如何添加新的键值对,迭代器都无法遍历到新的键值对,但是如果直接调用读取函数,是直接可以读取到的

楼主解决了吗,kv_print都打印不出来键值对,size很小的都不显示,但是又能get到

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants