#include "ICommand.h" #include #include #include #include #include namespace DB { namespace ErrorCodes { extern const int BAD_ARGUMENTS; } class CommandRead final : public ICommand { public: CommandRead() { command_name = "read"; command_option_description.emplace(createOptionsDescription("Allowed options", getTerminalWidth())); description = "read File `from_path` to `to_path` or to stdout\nPath should be in format './' or './path' or 'path'"; usage = "read [OPTION]... \nor\nread [OPTION]... "; command_option_description->add_options() ("output", po::value(), "set path to file to which we are read") ; } void processOptions( Poco::Util::LayeredConfiguration & config, po::variables_map & options) const override { if (options.count("output")) config.setString("output", options["output"].as()); } void execute( const std::vector & command_arguments, DB::ContextMutablePtr & global_context, Poco::Util::LayeredConfiguration & config) override { if (command_arguments.size() != 1) { printHelpMessage(); throw DB::Exception(DB::ErrorCodes::BAD_ARGUMENTS, "Bad Arguments"); } String disk_name = config.getString("disk", "default"); DiskPtr disk = global_context->getDisk(disk_name); String relative_path = validatePathAndGetAsRelative(command_arguments[0]); String path_output = config.getString("output", ""); if (!path_output.empty()) { String relative_path_output = validatePathAndGetAsRelative(path_output); auto in = disk->readFile(relative_path); auto out = disk->writeFile(relative_path_output); copyData(*in, *out); out->finalize(); return; } else { auto in = disk->readFile(relative_path); std::unique_ptr out = std::make_unique(STDOUT_FILENO); copyData(*in, *out); } } }; } std::unique_ptr makeCommandRead() { return std::make_unique(); }