ClickHouse
68 строк · 2.3 Кб
1#include "ICommand.h"
2#include <Interpreters/Context.h>
3#include <Common/TerminalSize.h>
4
5namespace DB
6{
7
8namespace ErrorCodes
9{
10extern const int BAD_ARGUMENTS;
11}
12
13class CommandCopy final : public ICommand
14{
15public:
16CommandCopy()
17{
18command_name = "copy";
19command_option_description.emplace(createOptionsDescription("Allowed options", getTerminalWidth()));
20description = "Recursively copy data from `FROM_PATH` to `TO_PATH`";
21usage = "copy [OPTION]... <FROM_PATH> <TO_PATH>";
22command_option_description->add_options()
23("disk-from", po::value<String>(), "disk from which we copy")
24("disk-to", po::value<String>(), "disk to which we copy");
25}
26
27void processOptions(
28Poco::Util::LayeredConfiguration & config,
29po::variables_map & options) const override
30{
31if (options.count("disk-from"))
32config.setString("disk-from", options["disk-from"].as<String>());
33if (options.count("disk-to"))
34config.setString("disk-to", options["disk-to"].as<String>());
35}
36
37void execute(
38const std::vector<String> & command_arguments,
39std::shared_ptr<DiskSelector> & disk_selector,
40Poco::Util::LayeredConfiguration & config) override
41{
42if (command_arguments.size() != 2)
43{
44printHelpMessage();
45throw DB::Exception(DB::ErrorCodes::BAD_ARGUMENTS, "Bad Arguments");
46}
47
48String disk_name_from = config.getString("disk-from", config.getString("disk", "default"));
49String disk_name_to = config.getString("disk-to", config.getString("disk", "default"));
50
51const String & path_from = command_arguments[0];
52const String & path_to = command_arguments[1];
53
54DiskPtr disk_from = disk_selector->get(disk_name_from);
55DiskPtr disk_to = disk_selector->get(disk_name_to);
56
57String relative_path_from = validatePathAndGetAsRelative(path_from);
58String relative_path_to = validatePathAndGetAsRelative(path_to);
59
60disk_from->copyDirectoryContent(relative_path_from, disk_to, relative_path_to, /* read_settings= */ {}, /* write_settings= */ {}, /* cancellation_hook= */ {});
61}
62};
63}
64
65std::unique_ptr <DB::ICommand> makeCommandCopy()
66{
67return std::make_unique<DB::CommandCopy>();
68}
69