/* * Copyright (c) 2020, Armink, * * SPDX-License-Identifier: Apache-2.0 */ /** * @file * @brief TSDB samples. * * Time series log (like TSDB) feature samples source file. * * TSL is time series log, the TSDB saved many TSLs. */ #include "flashdb.h" #include #ifdef FDB_USING_TSDB #define FDB_LOG_TAG "[sample][tsdb]" #ifdef FDB_USING_TIMESTAMP_64BIT #define __PRITS "ld" #else #define __PRITS "d" #endif struct env_status { int temp; int humi; }; static pika_bool query_cb(fdb_tsl_t tsl, void* arg); static pika_bool query_by_time_cb(fdb_tsl_t tsl, void* arg); static pika_bool set_status_cb(fdb_tsl_t tsl, void* arg); void tsdb_sample(fdb_tsdb_t tsdb) { struct fdb_blob blob; FDB_INFO("==================== tsdb_sample ====================\n"); { /* APPEND new TSL (time series log) */ struct env_status status; /* append new log to TSDB */ status.temp = 36; status.humi = 85; fdb_tsl_append(tsdb, fdb_blob_make(&blob, &status, sizeof(status))); FDB_INFO("append the new status.temp (%d) and status.humi (%d)\n", status.temp, status.humi); status.temp = 38; status.humi = 90; fdb_tsl_append(tsdb, fdb_blob_make(&blob, &status, sizeof(status))); FDB_INFO("append the new status.temp (%d) and status.humi (%d)\n", status.temp, status.humi); } { /* QUERY the TSDB */ /* query all TSL in TSDB by iterator */ fdb_tsl_iter(tsdb, query_cb, tsdb); } { /* QUERY the TSDB by time */ /* prepare query time (from 1970-01-01 00:00:00 to 2020-05-05 00:00:00) */ struct tm tm_from = {.tm_year = 1970 - 1900, .tm_mon = 0, .tm_mday = 1, .tm_hour = 0, .tm_min = 0, .tm_sec = 0}; struct tm tm_to = {.tm_year = 2020 - 1900, .tm_mon = 4, .tm_mday = 5, .tm_hour = 0, .tm_min = 0, .tm_sec = 0}; time_t from_time = mktime(&tm_from), to_time = mktime(&tm_to); size_t count; /* query all TSL in TSDB by time */ fdb_tsl_iter_by_time(tsdb, from_time, to_time, query_by_time_cb, tsdb); /* query all FDB_TSL_WRITE status TSL's count in TSDB by time */ count = fdb_tsl_query_count(tsdb, from_time, to_time, FDB_TSL_WRITE); FDB_INFO("query count is: %zu\n", count); } { /* SET the TSL status */ /* Change the TSL status by iterator or time iterator * set_status_cb: the change operation will in this callback * * NOTE: The actions to modify the state must be in order. * like: FDB_TSL_WRITE -> FDB_TSL_USER_STATUS1 -> FDB_TSL_DELETED * -> FDB_TSL_USER_STATUS2 The intermediate states can also be ignored. * such as: FDB_TSL_WRITE -> FDB_TSL_DELETED */ fdb_tsl_iter(tsdb, set_status_cb, tsdb); } FDB_INFO("===========================================================\n"); } static pika_bool query_cb(fdb_tsl_t tsl, void* arg) { struct fdb_blob blob; // rbg/kcf struct env_status status = {0}; fdb_tsdb_t db = arg; fdb_blob_read( (fdb_db_t)db, fdb_tsl_to_blob(tsl, fdb_blob_make(&blob, &status, sizeof(status)))); FDB_INFO("[query_cb] queried a TSL: time: %ld, temp: %d, humi: %d\n", tsl->time, status.temp, status.humi); return pika_false; } static pika_bool query_by_time_cb(fdb_tsl_t tsl, void* arg) { struct fdb_blob blob; // rbg/kcf struct env_status status = {0}; fdb_tsdb_t db = arg; fdb_blob_read( (fdb_db_t)db, fdb_tsl_to_blob(tsl, fdb_blob_make(&blob, &status, sizeof(status)))); // rbg/kcf FDB_INFO( "[query_by_time_cb] queried a TSL: time: %ld, temp: %d, humi: %d\n", tsl->time, status.temp, status.humi); return pika_false; } static pika_bool set_status_cb(fdb_tsl_t tsl, void* arg) { fdb_tsdb_t db = arg; FDB_INFO("set the TSL (time %ld) status from %d to %d\n", tsl->time, tsl->status, FDB_TSL_USER_STATUS1); fdb_tsl_set_status(db, tsl, FDB_TSL_USER_STATUS1); return pika_false; } #endif /* FDB_USING_TSDB */