summaryrefslogtreecommitdiff
path: root/lib/mu-server.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mu-server.cc')
-rw-r--r--lib/mu-server.cc21
1 files changed, 17 insertions, 4 deletions
diff --git a/lib/mu-server.cc b/lib/mu-server.cc
index 87757e6..62c9ca0 100644
--- a/lib/mu-server.cc
+++ b/lib/mu-server.cc
@@ -409,8 +409,11 @@ Server::Private::make_command_map()
"remove",
CommandInfo{
ArgMap{{":docid",
- ArgInfo{Type::Number, true, "document-id for the message to remove"}}},
- "remove a message from filesystem and database",
+ ArgInfo{Type::Number, false, "document-id for the message to remove"}},
+ {":path",
+ ArgInfo{Type::String, false, "document-id for the message to remove"}}
+ },
+ "remove a message from filesystem and database, using either :docid or :path",
[&](const auto& params) { remove_handler(params); }});
cmap.emplace(
@@ -989,8 +992,18 @@ Server::Private::quit_handler(const Command& cmd)
void
Server::Private::remove_handler(const Command& cmd)
{
- const auto docid{cmd.number_arg(":docid").value_or(0)};
- const auto path{path_from_docid(store(), docid)};
+ auto docid_opt{cmd.number_arg(":docid")};
+ auto path_opt{cmd.string_arg(":path")};
+
+ if (!!docid_opt == !!path_opt)
+ throw Error(Error::Code::InvalidArgument,
+ "must pass precisely one of :docid and :path");
+ std::string path;
+ Store::Id docid{};
+ if (docid = docid_opt.value_or(0); docid != 0)
+ path = path_from_docid(store(), docid);
+ else
+ path = path_opt.value();
if (::unlink(path.c_str()) != 0 && errno != ENOENT)
throw Error(Error::Code::File,