From a8a3a0c3bf183c5b5d447ee4ce637f763401548e Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Fri, 22 Apr 2022 08:13:09 +0300 Subject: [PATCH] message: implement update-after-move Allow for in-place updating of a moved document; i.e., without re-parsing --- lib/message/mu-message.cc | 17 +++++++++++++++++ lib/message/mu-message.hh | 15 ++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/lib/message/mu-message.cc b/lib/message/mu-message.cc index c6beb35b..e03a7a84 100644 --- a/lib/message/mu-message.cc +++ b/lib/message/mu-message.cc @@ -687,3 +687,20 @@ Message::mtime() const } + + +Result +Message::update_after_move(const std::string& new_path, + const std::string& new_maildir, + Flags new_flags) +{ + const auto statbuf{get_statbuf(new_path)}; + if (!statbuf) + return Err(statbuf.error()); + + priv_->doc.add(Field::Id::Path, new_path); + priv_->doc.add(Field::Id::Maildir, new_maildir); + priv_->doc.add(new_flags); + + return Ok(); +} diff --git a/lib/message/mu-message.hh b/lib/message/mu-message.hh index ac702438..3ddb56b5 100644 --- a/lib/message/mu-message.hh +++ b/lib/message/mu-message.hh @@ -29,6 +29,7 @@ #include "mu-fields.hh" #include "mu-document.hh" #include "mu-message-part.hh" +#include #include "utils/mu-utils.hh" #include "utils/mu-option.hh" @@ -87,7 +88,6 @@ public: return Err(Mu::Error(Error::Code::Message, "failed to create message")); } - /** * Construct a message based on a Message::Document * @@ -265,7 +265,6 @@ public: return document().string_vec_value(Field::Id::References); } - /* * Convert to Sexp */ @@ -280,10 +279,20 @@ public: Mu::Sexp::List to_sexp_list() const; Mu::Sexp to_sexp() const; + /* + * And some non-const message, for updating an existing + * message after a file-system move. + * + * @return Ok or an error. + */ + Result update_after_move(const std::string& new_path, + const std::string& new_maildir, + Flags new_flags); + + /* * Below require a file-backed message, which is a relatively slow * if there isn't one already; see load_mime_message() - * */ /**