From 961c8014ada037712e8c72f23430362e9f14c1ec Mon Sep 17 00:00:00 2001 From: jacqueline Date: Fri, 12 May 2023 10:30:07 +1000 Subject: Add some basic tests for the database --- src/database/file_gatherer.cpp | 60 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/database/file_gatherer.cpp (limited to 'src/database/file_gatherer.cpp') diff --git a/src/database/file_gatherer.cpp b/src/database/file_gatherer.cpp new file mode 100644 index 00000000..e3b89285 --- /dev/null +++ b/src/database/file_gatherer.cpp @@ -0,0 +1,60 @@ +#include "file_gatherer.hpp" + +#include +#include +#include +#include + +#include "ff.h" + +namespace database { + +static_assert(sizeof(TCHAR) == sizeof(char), "TCHAR must be CHAR"); + +auto FileGathererImpl::FindFiles(const std::string& root, + std::function cb) + -> void { + std::deque to_explore; + to_explore.push_back(root); + + while (!to_explore.empty()) { + std::string next_path_str = to_explore.front(); + const TCHAR* next_path = static_cast(next_path_str.c_str()); + + FF_DIR dir; + FRESULT res = f_opendir(&dir, next_path); + if (res != FR_OK) { + // TODO: log. + continue; + } + + for (;;) { + FILINFO info; + res = f_readdir(&dir, &info); + if (res != FR_OK || info.fname[0] == 0) { + // No more files in the directory. + break; + } else if (info.fattrib & (AM_HID | AM_SYS) || info.fname[0] == '.') { + // System or hidden file. Ignore it and move on. + continue; + } else { + std::stringstream full_path; + full_path << next_path_str << "/" << info.fname; + + if (info.fattrib & AM_DIR) { + // This is a directory. Add it to the explore queue. + to_explore.push_back(full_path.str()); + } else { + // This is a file! Let the callback know about it. + // std::invoke(cb, full_path.str(), info); + std::invoke(cb, full_path.str()); + } + } + } + + f_closedir(&dir); + to_explore.pop_front(); + } +} + +} // namespace database -- cgit v1.2.3