luat_fskv_sfd.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #ifdef __LUATOS__
  2. #include "luat_base.h"
  3. #include "luat_fskv.h"
  4. #include "luat_mem.h"
  5. #include "luat_msgbus.h"
  6. #include "luat_sfd.h"
  7. #define LUAT_LOG_TAG "fskv_sfd"
  8. #include "luat_log.h"
  9. #include "lfs.h"
  10. // TODO 应该对接vfs, 而非直接对接lfs
  11. extern luat_sfd_lfs_t* sfd_lfs;
  12. int luat_fskv_del(const char* key) {
  13. lfs_remove(&sfd_lfs->lfs, key);
  14. return 0;
  15. }
  16. int luat_fskv_set(const char* key, void* data, size_t len) {
  17. lfs_file_t fd = {0};
  18. int ret = 0;
  19. ret = lfs_file_open(&sfd_lfs->lfs, &fd, key, LFS_O_WRONLY | LFS_O_CREAT | LFS_O_TRUNC);
  20. if (ret != LFS_ERR_OK) {
  21. return -1;
  22. }
  23. ret = lfs_file_write(&sfd_lfs->lfs, &fd, data, len);
  24. ret |= lfs_file_close(&sfd_lfs->lfs, &fd);
  25. return ret;
  26. }
  27. int luat_fskv_get(const char* key, void* data, size_t len) {
  28. lfs_file_t fd = {0};
  29. int ret = 0;
  30. ret = lfs_file_open(&sfd_lfs->lfs, &fd, key, LFS_O_RDONLY);
  31. if (ret != LFS_ERR_OK) {
  32. return 0;
  33. }
  34. ret = lfs_file_read(&sfd_lfs->lfs, &fd, data, len);
  35. lfs_file_close(&sfd_lfs->lfs, &fd);
  36. return ret > 0 ? ret : 0;
  37. }
  38. int luat_fskv_clear(void) {
  39. int ret = 0;
  40. ret = lfs_format(&sfd_lfs->lfs, &sfd_lfs->conf);
  41. if (ret != LFS_ERR_OK) {
  42. LLOGE("fskv clear ret %d", ret);
  43. return ret;
  44. }
  45. ret = lfs_mount(&sfd_lfs->lfs, &sfd_lfs->conf);
  46. if (ret != LFS_ERR_OK) {
  47. LLOGE("fskv reinit ret %d", ret);
  48. return ret;
  49. }
  50. return 0;
  51. }
  52. int luat_fskv_stat(size_t *using_sz, size_t *total, size_t *kv_count) {
  53. *using_sz = lfs_fs_size(&sfd_lfs->lfs) * LFS_BLOCK_DEVICE_ERASE_SIZE;
  54. *total = LFS_BLOCK_DEVICE_TOTOAL_SIZE;
  55. lfs_dir_t dir = {0};
  56. int ret = lfs_dir_open(&sfd_lfs->lfs, &dir, "");
  57. if (ret != LFS_ERR_OK) {
  58. LLOGW("lfs_dir_open ret %d", ret);
  59. return -1;
  60. }
  61. size_t count = 0;
  62. struct lfs_info info = {0};
  63. while (1) {
  64. ret = lfs_dir_read(&sfd_lfs->lfs, &dir, &info);
  65. if (ret > 0) {
  66. if (info.type == LFS_TYPE_REG)
  67. count ++;
  68. }
  69. else
  70. break;
  71. }
  72. lfs_dir_close(&sfd_lfs->lfs, &dir);
  73. *kv_count = count;
  74. return 0;
  75. }
  76. int luat_fskv_size(const char* key, char buff[4]) {
  77. lfs_file_t fd = {0};
  78. int ret = 0;
  79. ret = lfs_file_open(&sfd_lfs->lfs, &fd, key, LFS_O_RDONLY);
  80. if (ret != LFS_ERR_OK) {
  81. return 0;
  82. }
  83. ret = lfs_file_size(&sfd_lfs->lfs, &fd);
  84. if (ret > 1 && ret < 256) {
  85. int ret2 = lfs_file_read(&sfd_lfs->lfs, &fd, buff, ret);
  86. if (ret2 != ret) {
  87. ret = -2; // 读取失败,肯定有问题
  88. }
  89. }
  90. lfs_file_close(&sfd_lfs->lfs, &fd);
  91. return ret;
  92. }
  93. int luat_fskv_next(char* buff, size_t offset) {
  94. lfs_dir_t dir = {0};
  95. struct lfs_info info = {0};
  96. // offset要+2, 因为前2个值是"."和".."两个dir
  97. offset += 2;
  98. int ret = lfs_dir_open(&sfd_lfs->lfs, &dir, "");
  99. if (ret < 0) {
  100. LLOGW("lfs_dir_open ret %d", ret);
  101. return -1;
  102. }
  103. ret = lfs_dir_seek(&sfd_lfs->lfs, &dir, offset);
  104. if (ret < 0) {
  105. lfs_dir_close(&sfd_lfs->lfs, &dir);
  106. return -2;
  107. }
  108. ret = lfs_dir_read(&sfd_lfs->lfs, &dir, &info);
  109. if (ret <= 0) {
  110. lfs_dir_close(&sfd_lfs->lfs, &dir);
  111. return -3;
  112. }
  113. memcpy(buff, info.name, strlen(info.name) + 1);
  114. lfs_dir_close(&sfd_lfs->lfs, &dir);
  115. return 0;
  116. }
  117. #endif