This is an automated email from the ASF dual-hosted git repository.

amarkovics pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git

commit d45587a248943496bf06310e13ebd3ad6b173dd6
Author: Marton Szasz <[email protected]>
AuthorDate: Wed Apr 20 19:08:30 2022 +0200

    MINIFICPP-1807 improve stat() error logging
    Closes #1311
    
    ...and change a few filesystem utilities.
    
    - renamed utils::file::to_sys_time_point to to_sys
    - passing file_time_type by value, because it's just an integer
    - added a fix for libc++14, which behaves more like libstdc++ when it comes 
to file_clock
    
    Signed-off-by: Adam Markovics <[email protected]>
---
 extensions/libarchive/UnfocusArchiveEntry.cpp         |  3 ++-
 extensions/standard-processors/processors/GetFile.cpp | 19 +++++++++----------
 extensions/standard-processors/processors/ListFile.h  |  2 +-
 libminifi/include/utils/file/FileUtils.h              |  9 +++++----
 libminifi/src/utils/file/FileUtils.cpp                | 12 ++++++------
 5 files changed, 23 insertions(+), 22 deletions(-)

diff --git a/extensions/libarchive/UnfocusArchiveEntry.cpp 
b/extensions/libarchive/UnfocusArchiveEntry.cpp
index 2f6c1ac74..fc1f94b94 100644
--- a/extensions/libarchive/UnfocusArchiveEntry.cpp
+++ b/extensions/libarchive/UnfocusArchiveEntry.cpp
@@ -25,6 +25,7 @@
 #include <memory>
 #include <string>
 #include <set>
+#include <system_error>
 
 #include "archive.h"
 #include "archive_entry.h"
@@ -181,7 +182,7 @@ int64_t 
UnfocusArchiveEntry::WriteCallback::operator()(const std::shared_ptr<io:
     if (entryMetadata.entryType == AE_IFREG && entryMetadata.entrySize > 0) {
       size_t stat_ok = stat(entryMetadata.tmpFileName.c_str(), &st);
       if (stat_ok != 0) {
-        logger_->log_error("Error statting %s: %d", entryMetadata.tmpFileName, 
stat_ok);
+        logger_->log_error("Error statting %s: %s", entryMetadata.tmpFileName, 
std::system_category().default_error_condition(errno).message());
       }
       archive_entry_copy_stat(entry, &st);
     }
diff --git a/extensions/standard-processors/processors/GetFile.cpp 
b/extensions/standard-processors/processors/GetFile.cpp
index 2d59cdc25..49a529412 100644
--- a/extensions/standard-processors/processors/GetFile.cpp
+++ b/extensions/standard-processors/processors/GetFile.cpp
@@ -25,6 +25,7 @@
 #include <queue>
 #include <map>
 #include <memory>
+#include <regex>
 #include <set>
 #include <string>
 
@@ -231,19 +232,17 @@ std::queue<std::string> GetFile::pollListing(uint64_t 
batch_size) {
 bool GetFile::fileMatchesRequestCriteria(std::string fullName, std::string 
name, const GetFileRequest &request) {
   logger_->log_trace("Checking file: %s", fullName);
 
-#ifdef WIN32
-  struct _stat64 statbuf;
-  if (_stat64(fullName.c_str(), &statbuf) != 0) {
+  std::error_code ec;
+  uint64_t file_size = std::filesystem::file_size(fullName, ec);
+  if (ec) {
+    logger_->log_error("file_size of %s: %s", fullName, ec.message());
     return false;
   }
-#else
-  struct stat statbuf;
-  if (stat(fullName.c_str(), &statbuf) != 0) {
+  const auto modifiedTime = std::filesystem::last_write_time(fullName, ec);
+  if (ec) {
+    logger_->log_error("last_write_time of %s: %s", fullName, ec.message());
     return false;
   }
-#endif
-  uint64_t file_size = gsl::narrow<uint64_t>(statbuf.st_size);
-  auto modifiedTime = std::chrono::system_clock::time_point() + 
std::chrono::seconds(gsl::narrow<uint64_t>(statbuf.st_mtime));
 
   if (request.minSize > 0 && file_size < request.minSize)
     return false;
@@ -251,7 +250,7 @@ bool GetFile::fileMatchesRequestCriteria(std::string 
fullName, std::string name,
   if (request.maxSize > 0 && file_size > request.maxSize)
     return false;
 
-  auto fileAge = 
std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()
 - modifiedTime);
+  auto fileAge = 
std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::file_clock::now()
 - modifiedTime);
   if (request.minAge > 0ms && fileAge < request.minAge)
     return false;
   if (request.maxAge > 0ms && fileAge > request.maxAge)
diff --git a/extensions/standard-processors/processors/ListFile.h 
b/extensions/standard-processors/processors/ListFile.h
index cef41b6b1..83b3d8606 100644
--- a/extensions/standard-processors/processors/ListFile.h
+++ b/extensions/standard-processors/processors/ListFile.h
@@ -60,7 +60,7 @@ class ListFile : public core::Processor {
  private:
   struct ListedFile : public utils::ListedObject {
     [[nodiscard]] std::chrono::time_point<std::chrono::system_clock> 
getLastModified() const override {
-      return 
std::chrono::time_point_cast<std::chrono::milliseconds>(utils::file::FileUtils::to_sys_time_point(last_modified_time));
+      return 
std::chrono::time_point_cast<std::chrono::milliseconds>(utils::file::FileUtils::to_sys(last_modified_time));
     }
 
     [[nodiscard]] std::string getKey() const override {
diff --git a/libminifi/include/utils/file/FileUtils.h 
b/libminifi/include/utils/file/FileUtils.h
index c4b1b68cb..6ba8a3654 100644
--- a/libminifi/include/utils/file/FileUtils.h
+++ b/libminifi/include/utils/file/FileUtils.h
@@ -116,8 +116,9 @@ inline char get_separator(bool /*force_posix*/ = false) {
   return '/';
 }
 #endif
-time_t to_time_t(const std::filesystem::file_time_type& time);
-std::chrono::time_point<std::chrono::system_clock> to_sys_time_point(const 
std::filesystem::file_time_type& time);
+time_t to_time_t(std::filesystem::file_time_type time);
+
+std::chrono::system_clock::time_point to_sys(std::filesystem::file_time_type 
time);
 
 inline std::string normalize_path_separators(std::string path, bool 
force_posix = false) {
   const auto normalize_separators = [force_posix](const char c) {
@@ -161,7 +162,7 @@ inline int64_t delete_dir(const std::string &path, bool 
delete_files_recursively
 }
 
 inline std::chrono::time_point<std::chrono::file_clock,
-                               std::chrono::seconds> 
last_write_time_point(const std::string &path) {
+    std::chrono::seconds> last_write_time_point(const std::string &path) {
   std::error_code ec;
   auto result = std::filesystem::last_write_time(path, ec);
   if (ec.value() == 0) {
@@ -170,7 +171,7 @@ inline std::chrono::time_point<std::chrono::file_clock,
   return std::chrono::time_point<std::chrono::file_clock, 
std::chrono::seconds>{};
 }
 
-inline const std::optional<std::filesystem::file_time_type> 
last_write_time(const std::string &path) {
+inline std::optional<std::filesystem::file_time_type> last_write_time(const 
std::string &path) {
   std::error_code ec;
   auto result = std::filesystem::last_write_time(path, ec);
   if (ec.value() == 0) {
diff --git a/libminifi/src/utils/file/FileUtils.cpp 
b/libminifi/src/utils/file/FileUtils.cpp
index 2dc6f41f8..33602a9fe 100644
--- a/libminifi/src/utils/file/FileUtils.cpp
+++ b/libminifi/src/utils/file/FileUtils.cpp
@@ -86,20 +86,20 @@ bool contains(const std::filesystem::path& file_path, 
std::string_view text_to_s
   return check_range(left.size(), left.size() + right.size());
 }
 
-time_t to_time_t(const std::filesystem::file_time_type& file_time) {
+time_t to_time_t(std::filesystem::file_time_type file_time) {
 #if defined(WIN32)
-  return std::chrono::system_clock::to_time_t(to_sys_time_point(file_time));
-#elif defined(_LIBCPP_VERSION)
+  return std::chrono::system_clock::to_time_t(to_sys(file_time));
+#elif defined(_LIBCPP_VERSION) && _LIBCPP_VERSION < 14000
   return std::chrono::file_clock::to_time_t(file_time);
 #else
-  return std::chrono::system_clock::to_time_t(to_sys_time_point(file_time));
+  return std::chrono::system_clock::to_time_t(to_sys(file_time));
 #endif
 }
 
-std::chrono::time_point<std::chrono::system_clock> to_sys_time_point(const 
std::filesystem::file_time_type& file_time) {
+std::chrono::time_point<std::chrono::system_clock> 
to_sys(std::filesystem::file_time_type file_time) {
 #if defined(WIN32)
   return 
std::chrono::time_point_cast<std::chrono::system_clock::duration>(file_time - 
std::filesystem::file_time_type::clock::now() + 
std::chrono::system_clock::now());
-#elif defined(_LIBCPP_VERSION)
+#elif defined(_LIBCPP_VERSION) && _LIBCPP_VERSION < 14000
   return 
std::chrono::system_clock::from_time_t(std::chrono::file_clock::to_time_t(file_time));
 #else
   return std::chrono::file_clock::to_sys(file_time);

Reply via email to