diff options
| author | Dan Engelbrecht <[email protected]> | 2023-06-12 22:24:13 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-06-12 22:24:13 +0200 |
| commit | 32868966b705f2a4a72dbc7c427587b3717b758d (patch) | |
| tree | 286a2eb19bb599f268bb07457703ec771eb78667 /src/zen/cmds/projectstore.cpp | |
| parent | fix jupiter access token for oplog upload (#330) (diff) | |
| download | archived-zen-32868966b705f2a4a72dbc7c427587b3717b758d.tar.xz archived-zen-32868966b705f2a4a72dbc7c427587b3717b758d.zip | |
add oplog snapshot command (#331)
* add zen oplog-snapshot command line tool
* changelog
Diffstat (limited to 'src/zen/cmds/projectstore.cpp')
| -rw-r--r-- | src/zen/cmds/projectstore.cpp | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/zen/cmds/projectstore.cpp b/src/zen/cmds/projectstore.cpp index e95b230b8..cca155e19 100644 --- a/src/zen/cmds/projectstore.cpp +++ b/src/zen/cmds/projectstore.cpp @@ -844,6 +844,77 @@ ImportOplogCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** arg return MapHttpToCommandReturnCode(Response); } +//////////////////////////// + +SnapshotOplogCommand::SnapshotOplogCommand() +{ + m_Options.add_options()("h,help", "Print help"); + m_Options.add_option("", "u", "hosturl", "Host URL", cxxopts::value(m_HostName)->default_value(""), "<hosturl>"); + m_Options.add_option("", "p", "project", "Project name", cxxopts::value(m_ProjectName), "<projectid>"); + m_Options.add_option("", "o", "oplog", "Oplog name", cxxopts::value(m_OplogName), "<oplogid>"); + + m_Options.parse_positional({"project", "oplog"}); +} + +SnapshotOplogCommand::~SnapshotOplogCommand() +{ +} + +int +SnapshotOplogCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) +{ + using namespace std::literals; + + ZEN_UNUSED(GlobalOptions); + + if (!ParseOptions(argc, argv)) + { + return 0; + } + + m_HostName = ResolveTargetHostSpec(m_HostName); + + if (m_HostName.empty()) + { + throw zen::OptionParseException("unable to resolve server specification"); + } + + if (m_ProjectName.empty()) + { + ZEN_ERROR("Project name must be given"); + return 1; + } + + if (m_OplogName.empty()) + { + ZEN_ERROR("Oplog name must be given"); + return 1; + } + + cpr::Session Session; + + const std::string TargetUrlBase = fmt::format("{}/prj", m_HostName); + + Session.SetUrl(fmt::format("{}/{}/oplog/{}/rpc", TargetUrlBase, m_ProjectName, m_OplogName)); + Session.SetHeader( + {{"Accept", "application/json"}, {"Content-Type", std::string(zen::MapContentTypeToString(zen::HttpContentType::kCbObject))}}); + + zen::CbObjectWriter Writer; + Writer.AddString("method"sv, "snapshot"sv); + + zen::BinaryWriter MemOut; + Writer.Save(MemOut); + Session.SetBody(cpr::Body{(const char*)MemOut.GetData(), MemOut.GetSize()}); + + ZEN_CONSOLE("Snapshotting oplog '{}/{}' to {}", m_ProjectName, m_OplogName, m_HostName); + cpr::Response Response = Session.Post(); + + ZEN_CONSOLE("{}", FormatHttpResponse(Response)); + return MapHttpToCommandReturnCode(Response); +} + +//////////////////////////// + ProjectStatsCommand::ProjectStatsCommand() { m_Options.add_options()("h,help", "Print help"); @@ -896,6 +967,8 @@ ProjectStatsCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** ar return 1; } +//////////////////////////// + ProjectDetailsCommand::ProjectDetailsCommand() { m_Options.add_options()("h,help", "Print help"); |