TSDB 基础示例

    示例代码位于 ,包含追加、查询及状态修改这几个过程,大致代码如下:

    分别来看下这几个过程

    • 追加:分两次修改结构体对象 status 的值然后追加到 TSDB 中;

    • 查询:通过 TSDB 的迭代器 API ,在每次迭代时会自动执行 query_cb 回调函数,实现对 TSDB 中所有记录的查询,回调函数内容如下:

      1. static bool query_cb(fdb_tsl_t tsl, void *arg)
      2. {
      3. struct fdb_blob blob;
      4. struct env_status status;
      5. fdb_tsdb_t db = arg;
      6. fdb_blob_read((fdb_db_t) db, fdb_tsl_to_blob(tsl, fdb_blob_make(&blob, &status, sizeof(status))));
      7. FDB_INFO("[query_cb] queried a TSL: time: %ld, temp: %d, humi: %d\n", tsl->time, status.temp, status.humi);
      8. return false;
    • 修改状态:每条 TSL 在被追加到 TSDB 后,都可以修改其状态,状态共有 4 种:

      • FDB_TSL_WRITE:已写入状态,TSL 被追加到 TSDB 中后的默认状态;

      • FDB_TSL_USER_STATUS1:该状态介于写入与删除之间,用户可自定义其状态含义,比如:数据已被同步至云端;

      • :已删除状态,当 TSL 需要删除时,修改 TSL 的状态为该状态即可;

      • FDB_TSL_USER_STATUS2:删除状态之后的自定义状态,预留给用户使用;

      修改状态时只能按照 FDB_TSL_WRITE -> FDB_TSL_USER_STATUS1 -> FDB_TSL_DELETED -> FDB_TSL_USER_STATUS2 顺序进行修改,不能逆序修改。也可以跳过中间状态,例如:从 FDB_TSL_WRITE 直接修改为FDB_TSL_DELETED 状态,跳过 FDB_TSL_USER_STATUS1 状态。

      示例中通过迭代器将当前所有的 TSL 都修改为 FDB_TSL_USER_STATUS1 状态,迭代器中的回调代码如下:

      1. static bool set_status_cb(fdb_tsl_t tsl, void *arg)
      2. {
      3. fdb_tsdb_t db = arg;
      4. FDB_INFO("set the TSL (time %ld) status from %d to %d\n", tsl->time, tsl->status, FDB_TSL_USER_STATUS1);
      5. fdb_tsl_set_status(db, tsl, FDB_TSL_USER_STATUS1);
      6. return false;
      7. }

    通过日志可看出,示例首先追加了两条 TSL ,每条 TSL 分别存放了不同的温度及湿度记录。然后再通过普通查询和按时间查询方式,将 TSDB 中的 TSL 获取出来,最后修改其状态,从 2: FDB_TSL_WRITE3: FDB_TSL_USER_STATUS1

    1. [FlashDB][sample][tsdb] append the new status.temp (36) and status.humi (85)
    2. [FlashDB][sample][tsdb] append the new status.temp (38) and status.humi (90)
    3. [FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 1, temp: 36, humi: 85
    4. [FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 2, temp: 38, humi: 90
    5. [FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 3, temp: 36, humi: 85
    6. [FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 4, temp: 38, humi: 90
    7. [FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 1, temp: 36, humi: 85
    8. [FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 2, temp: 38, humi: 90
    9. [FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 3, temp: 36, humi: 85
    10. [FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 4, temp: 38, humi: 90
    11. [FlashDB][sample][tsdb] query count is: 2
    12. [FlashDB][sample][tsdb] set the TSL (time 1) status from 3 to 3
    13. [FlashDB][sample][tsdb] set the TSL (time 2) status from 3 to 3
    14. [FlashDB][sample][tsdb] set the TSL (time 3) status from 2 to 3
    15. [FlashDB][sample][tsdb] set the TSL (time 4) status from 2 to 3