| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| |
| #pragma once |
| |
| #include <exception> |
| #include <sstream> |
| #include <string> |
| #include <utility> |
| |
| #include "arrow/type_fwd.h" |
| #include "arrow/util/string_util.h" |
| #include "parquet/platform.h" |
| |
| #ifdef _MSC_VER |
| # pragma warning(push) |
| // Disable warning for STL types usage in DLL interface |
| // https://web.archive.org/web/20130317015847/http://connect.microsoft.com/VisualStudio/feedback/details/696593/vc-10-vs-2010-basic-string-exports |
| # pragma warning(disable : 4275 4251) |
| // Disable diamond inheritance warnings |
| # pragma warning(disable : 4250) |
| // Disable macro redefinition warnings |
| # pragma warning(disable : 4005) |
| // Disable extern before exported template warnings |
| # pragma warning(disable : 4910) |
| #endif |
| |
| // PARQUET-1085 |
| #if !defined(ARROW_UNUSED) |
| # define ARROW_UNUSED(x) UNUSED(x) |
| #endif |
| |
| // Parquet exception to Arrow Status |
| |
| #define BEGIN_PARQUET_CATCH_EXCEPTIONS try { |
| #define END_PARQUET_CATCH_EXCEPTIONS \ |
| } \ |
| catch (const ::parquet::ParquetStatusException& e) { \ |
| return e.status(); \ |
| } \ |
| catch (const ::parquet::ParquetException& e) { \ |
| return ::arrow::Status::IOError(e.what()); \ |
| } |
| |
| // clang-format off |
| |
| #define PARQUET_CATCH_NOT_OK(s) \ |
| BEGIN_PARQUET_CATCH_EXCEPTIONS \ |
| (s); \ |
| END_PARQUET_CATCH_EXCEPTIONS |
| |
| // clang-format on |
| |
| #define PARQUET_CATCH_AND_RETURN(s) \ |
| BEGIN_PARQUET_CATCH_EXCEPTIONS \ |
| return (s); \ |
| END_PARQUET_CATCH_EXCEPTIONS |
| |
| // Arrow Status to Parquet exception |
| |
| #define PARQUET_IGNORE_NOT_OK(s) \ |
| do { \ |
| ::arrow::Status _s = ::arrow::ToStatus(s); \ |
| ARROW_UNUSED(_s); \ |
| } while (0) |
| |
| #define PARQUET_THROW_NOT_OK(s) \ |
| do { \ |
| ::arrow::Status _s = ::arrow::ToStatus(s); \ |
| if (!_s.ok()) { \ |
| throw ::parquet::ParquetStatusException(std::move(_s)); \ |
| } \ |
| } while (0) |
| |
| #define PARQUET_ASSIGN_OR_THROW_IMPL(status_name, lhs, rexpr) \ |
| auto status_name = (rexpr); \ |
| PARQUET_THROW_NOT_OK(status_name.status()); \ |
| lhs = std::move(status_name).ValueOrDie(); |
| |
| #define PARQUET_ASSIGN_OR_THROW(lhs, rexpr) \ |
| PARQUET_ASSIGN_OR_THROW_IMPL(ARROW_ASSIGN_OR_RAISE_NAME(_error_or_value, __COUNTER__), \ |
| lhs, rexpr); |
| |
| namespace parquet { |
| |
| class PARQUET_EXPORT ParquetException : public std::exception { |
| public: |
| PARQUET_NORETURN static void EofException(const std::string& msg = "") { |
| static std::string prefix = "Unexpected end of stream"; |
| if (msg.empty()) { |
| throw ParquetException(prefix); |
| } |
| throw ParquetException(prefix, ": ", msg); |
| } |
| |
| PARQUET_NORETURN static void NYI(const std::string& msg = "") { |
| throw ParquetException("Not yet implemented: ", msg, "."); |
| } |
| |
| template <typename... Args> |
| explicit ParquetException(Args&&... args) |
| : msg_(::arrow::internal::JoinToString(std::forward<Args>(args)...)) {} |
| |
| explicit ParquetException(std::string msg) : msg_(std::move(msg)) {} |
| |
| explicit ParquetException(const char* msg, const std::exception&) : msg_(msg) {} |
| |
| ParquetException(const ParquetException&) = default; |
| ParquetException& operator=(const ParquetException&) = default; |
| ParquetException(ParquetException&&) = default; |
| ParquetException& operator=(ParquetException&&) = default; |
| |
| const char* what() const noexcept override { return msg_.c_str(); } |
| |
| private: |
| std::string msg_; |
| }; |
| |
| // Support printing a ParquetException. |
| // This is needed for clang-on-MSVC as there operator<< is not defined for |
| // std::exception. |
| PARQUET_EXPORT |
| std::ostream& operator<<(std::ostream& os, const ParquetException& exception); |
| |
| class ParquetStatusException : public ParquetException { |
| public: |
| explicit ParquetStatusException(::arrow::Status status) |
| : ParquetException(status.ToString()), status_(std::move(status)) {} |
| |
| const ::arrow::Status& status() const { return status_; } |
| |
| private: |
| ::arrow::Status status_; |
| }; |
| |
| // This class exists for the purpose of detecting an invalid or corrupted file. |
| class ParquetInvalidOrCorruptedFileException : public ParquetStatusException { |
| public: |
| ParquetInvalidOrCorruptedFileException(const ParquetInvalidOrCorruptedFileException&) = |
| default; |
| |
| template <typename Arg, |
| typename std::enable_if< |
| !std::is_base_of<ParquetInvalidOrCorruptedFileException, Arg>::value, |
| int>::type = 0, |
| typename... Args> |
| explicit ParquetInvalidOrCorruptedFileException(Arg arg, Args&&... args) |
| : ParquetStatusException(::arrow::Status::Invalid(std::forward<Arg>(arg), |
| std::forward<Args>(args)...)) {} |
| }; |
| |
| template <typename StatusReturnBlock> |
| void ThrowNotOk(StatusReturnBlock&& b) { |
| PARQUET_THROW_NOT_OK(b()); |
| } |
| |
| } // namespace parquet |
| |
| #ifdef _MSC_VER |
| # pragma warning(pop) |
| #endif |