#pragma once #include "ICommand.h" namespace DB { namespace ErrorCodes { extern const int BAD_ARGUMENTS; } class CommandRead : public ICommand { public: CommandRead() { command_name = "read"; command_option_description.emplace(createOptionsDescription("Help Message for read", getTerminalWidth())); description = "read File `from_path` to `to_path` or to stdout\nPath should be in format './' or './path' or 'path'"; usage = "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 executeImpl( const DB::ContextMutablePtr & global_context, const Poco::Util::LayeredConfiguration & config) const override { if (pos_arguments.size() != 1) { printHelpMessage(); throw DB::Exception("Bad Arguments", DB::ErrorCodes::BAD_ARGUMENTS); } String disk_name = config.getString("disk", "default"); String path = pos_arguments[0]; DiskPtr disk = global_context->getDisk(disk_name); String full_path = fullPathWithValidate(disk, path); String path_output = config.getString("output", ""); if (!path_output.empty()) { String full_path_output = fullPathWithValidate(disk, path_output); auto in = disk->readFile(full_path); auto out = disk->writeFile(full_path_output); copyData(*in, *out); out->finalize(); return; } else { auto in = disk->readFile(full_path); std::unique_ptr out = std::make_unique(STDOUT_FILENO); copyData(*in, *out); } } }; } std::unique_ptr makeCommandRead() { return std::make_unique(); }