#pragma once #include #include #include #include namespace DB { /** Принимает имя файла. Самостоятельно открывает и закрывает файл. */ class WriteBufferFromFile : public WriteBufferFromFileDescriptor { private: std::string file_name; public: WriteBufferFromFile(const std::string & file_name_, size_t buf_size = DBMS_DEFAULT_BUFFER_SIZE, int flags = -1, mode_t mode = 0666) : WriteBufferFromFileDescriptor(-1, buf_size), file_name(file_name_) { fd = open(file_name.c_str(), flags == -1 ? O_WRONLY | O_TRUNC | O_CREAT : flags, mode); if (-1 == fd) throwFromErrno("Cannot open file " + file_name, errno == ENOENT ? ErrorCodes::FILE_DOESNT_EXIST : ErrorCodes::CANNOT_OPEN_FILE); } ~WriteBufferFromFile() { bool uncaught_exception = std::uncaught_exception(); if (!uncaught_exception) next(); if (0 != close(fd) && !uncaught_exception) throwFromErrno("Cannot close file " + file_name, ErrorCodes::CANNOT_CLOSE_FILE); } virtual std::string getFileName() { return file_name; } }; }